【问题标题】:Rails: associations for models, using :dependent and :foreign keysRails:模型的关联,使用 :dependent 和 :foreign 键
【发布时间】:2013-06-14 21:15:07
【问题描述】:

我正在制作我的第一个 Rails 应用程序(实际上这是我的第一次编程体验),我有几个关于模型和关联的问题。

我的第一个应用是博客。
博客有用户。用户有帖子。
一篇文章有​​一个类别。
帖子也可以有标签。
一个标签有一个类别(就像帖子一样)。
例如:
类别“工作”有标签“sql”、“分析”、“excel”等。
“个人”类别有“旅行”、“照片”、“冲浪”等标签。

http://img18.imageshack.us/img18/2213/3m1.png
这是带有关联的数据库结构示意图。

这是我的问题清单:

  1. 如何优化这种模型结构?或者没关系? (我对Category模型有一种奇怪的感觉)

  2. 这些模型关联是否正确?

  3. 我是否需要将 :foreign_key 和 :dependent 与关联一起使用?

  4. 当我销毁 Category 时,相关帖子会发生什么情况(如果 :dependent 未声明)?

  5. 我需要在数据库端有外键吗?

感谢您的回答!

【问题讨论】:

    标签: ruby-on-rails foreign-keys dependencies model-associations


    【解决方案1】:

    (1)。如何优化这种模型结构?或者没关系? (我对Category模型有一种奇怪的感觉)

    对我来说一切都很好

    (2)。这些模型关联是否正确?

    他们似乎是

    (3)。我需要使用 :foreign_key 和 :dependent 关联吗?

    foreign_key:不,你不需要,但那是因为你遵循所有的 Rails 约定

    这是一个示例,您可以使用 foreign_key 属性,而不是您想将其称为 post.author 的 post.user

    class Post
      belongs_to :author, class_name: "User", foreign_key: "user_id"
    

    或者 - 如果帖子既有作者又有评论者

    class Post
      belongs_to :author, class_name: "User", foreign_key: "user_id"
      belongs_to :reviewer, class_name: "User" # foreign key not needed if users.reviewer_id is the data base column name
    

    依赖:可选,在某些情况下是个好主意

    (4)。当我销毁 Category 时(如果 :dependent 未声明),相关帖子会发生什么?

    has_many :posts, :dependent => :destroy 将在该类别被删除时删除该类别的所有帖子

    如果您只保留has_many :posts,我相信销毁该类别将是其中之一

    • 什么都没有,让您的帖子引用一个不存在的类别(这很糟糕)
    • 将帖子上的 category_id 更新为 NULL(我认为在您的情况下,您不想要一个具有空类别的帖子?)

    我不是删除数据的忠实拥护者 - 我是否建议在您的类别中添加 is_active 属性? 然后您可以根据该值有选择地显示类别或发布数据

    (5)。我需要在数据库端有外键吗?

    否 - 长期以来,rails 社区一直反对外键约束(不确定是否仍然如此)他们认为应该在代码中强制执行数据完整性

    就个人而言 - 我是数据库外键约束的忠实拥护者,您可能会发现在某些情况下使用它们时必须与 Rails 作斗争 那里有一些宝石可能有助于为您生成它们 - https://www.google.com/search?q=rails+gem+foreign+keys

    注意事项

    另一个好资源:http://guides.rubyonrails.org/association_basics.html(用于数据模型)- 其他指南也非常好

    看起来您在数据建模方面正朝着正确的方向前进 - 我可能会建议您在开始构建应用程序时,从最简单的事情开始 - 只需一个用户和一个帖子,然后像您一样在其他模型中分层去

    也适用于您的用户 - 我建议您在启动应用程序时 - 使用设计 gem 及其生成器来创建您的用户模型(注意:它还将处理所有用户创建和身份验证需求 - 视图和控制器,这是一个很好的方法快速开始使用任何应用程序)

    rails generate devise:install 然后rails generate devise User

    https://github.com/plataformatec/devise

    【讨论】:

      猜你喜欢
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2013-10-24
      • 2014-03-21
      • 1970-01-01
      相关资源
      最近更新 更多