我正在制作我的第一个Rails应用程序(实际上这是我的第一次编程体验),我有一些关于模型和关联的问题。
我的第一个应用是博客
博客有用户。用户有帖子。
一个帖子有一个类别
邮政也可以有标签
一个标签有一个类别(就像帖子一样)
例如:
类别“工作”有标签“sql”,“analytics”,“excel”等
类别“个人”有标签“旅行”,“照片”,“冲浪”等。
http://img18.imageshack.us/img18/2213/3m1.png
这是带关联的数据库结构草图。
以下是我的问题清单:
如何优化此模型结构?或者没关系? (我对分类模型有一种奇怪的感觉)
模型的这些关联是否正确?
我是否需要使用:foreign_key和:依赖关联?
当我销毁类别(如果:依赖未声明)时,关联帖子会发生什么?
我是否需要在数据库端拥有外键?
感谢您的回答!
答案 0 :(得分:2)
(1)。我该如何优化这种模型结构?或者没关系? (我对分类模型有一种奇怪的感觉)
这对我来说都很好看
(2)。模型的这些关联是否正确?
他们似乎是
(3)。我是否需要使用:foreign_key和:依赖关联?
foreign_key:不,你不需要,但那是因为你遵循所有的轨道约定
这里有一个例子,你可以使用foreign_key属性,而不是post.user,你想把它称为post.author
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)。当我破坏类别(如果:依赖未声明)时,相关帖子会发生什么?
has_many :posts, :dependent => :destroy
会删除该类别的所有帖子
如果您保留has_many :posts
我认为销毁该类别会执行
我不是删除数据的狂热粉丝 - 我是否可以建议在您的类别中添加is_active
属性?
然后,您可以根据该值选择性地显示类别或发布数据
(5)。我是否需要在数据库端使用外键?
否 - 长期以来,rails社区一直反对外键约束(不确定是否仍然如此)他们认为数据完整性应该在代码中强制执行
就个人而言 - 我是数据库外键约束的忠实粉丝,你可能会发现在某些情况下你必须使用它们来对抗它们 有一些宝石可能有助于为您生成它们 - https://www.google.com/search?q=rails+gem+foreign+keys
注释
另一个好的资源:http://guides.rubyonrails.org/association_basics.html(对于数据模型) - 其他指南也非常好
看起来你正朝着正确的方向进行数据建模 - 我可能会建议你开始构建应用程序,从最简单的事情开始 - 只需一个用户和一个帖子,然后在其他模型中分层去
同样适合您的用户 - 我建议您启动应用程序时 - 使用设计宝石及其生成器来创建您的用户模型(注意:它还将处理所有用户创建和身份验证需求 - 视图和控制器,这是一个很好的方法在任何应用程序上获得快速启动)
rails generate devise:install
然后rails generate devise User