在脚手架生成代码时建立关联关系

42

您好,我是 Ruby on Rails 的新手。我正在尝试创建一个小型博客站点。我有两个表,即“帖子”和“评论”。每篇帖子都会有很多评论。我使用以下命令生成这些表格:

rails g scaffold Post title:string body:text author:string
rails g scaffold Comment body:string author:string

现在我想将关系添加到模型类中。我在Post类中添加了has_many :comments,并在Comment类中添加了belongs_to :post。但是,当我尝试调用post.comments时,我遇到了一个运行时错误,说SQLException: no such column: comments.post_id。我应该创建一个迁移并在Comment下添加post_id,还是在脚手架建立时就有一种方法可以实现这一点?


1
请参考 https://coderwall.com/p/f5mdoq 获取帮助。 - Ivan Black
1
你能否更改这个问题的已接受答案,因为当前接受的答案已经过时了吗?谢谢。 - JamieD
3个回答

157

Scaffold其实提供了一种生成关系的方式,您应该使用:references数据类型。

rails g scaffold Comment body:string author:string post:references

这将生成一个具有post_id字段和相应索引的评论表迁移。生成器还会在Comment模型中添加belongs_to :post

但是,它不会生成关系的反向,因此您需要添加:

has_many :comments

如果需要,您需要自己对Post模型进行修改。此外,如果您需要,还需要添加嵌套资源路由,因为生成器无法处理这个。


1
当您手动添加has_many字段时,如何生成迁移? - lapinkoira
3
在上面的示例中,当使用脚手架生成评论模型时包含的 post:references 部分将在评论模型上添加一个外键,该外键指向它所属的帖子。在 Post 模型中需添加 has_many :comments 关系,但无需进行额外的迁移。 - darkmoves

9
你肯定已经走在了正确的道路上。如果你在生成Comment脚手架时加入post_id列,那么你的关联关系将会起作用(尽管你仍需要添加has_many :commentsbelongs_to :post)。
因此,更新后的生成器调用如下所示:
rails g scaffold Comment body:string author:string post_id:integer

在这种情况下,使用 :foreign_key 而不是 :integer 是否更好呢? - Arthur Collé

3

您也可以这样使用belongs_to

rails g scaffold Comment body:string author:string post:belongs_to

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接