Reputation: 6794
Hi I am new to Ruby on Rails. I am trying to create a small blog site. I have two tables Posts and Comments. Each Post will have many comments. I generate the tables using these commands.
rails g scaffold Post title:string body:text author:string
rails g scaffold Comment body:string author:string
Now I want to add the relationship to the model classes. I add has_many :comments
to the Post class and belongs_to :post
to the Comment class. However when I try to call post.comments
I get a runtime error saying SQLException: no such column: comments.post_id
. Should I create a migration and add post_id under Comment or is there a way to achieve this when scaffolding?
Upvotes: 43
Views: 28609
Reputation: 7210
You can also use belongs_to
like this:
rails g scaffold Comment body:string author:string post:belongs_to
Upvotes: 3
Reputation: 2747
Scaffold actually provides a way to generate relationships, you should use the :references
data type
rails g scaffold Comment body:string author:string post:references
This will generate a migration for the comments table with a post_id field and index for it. The generator will also add belongs_to :post
to the Comment model.
It will not however generate the reverse side of the relationship so you'll need to add
has_many :comments
to the Post model yourself. You will also need to add nested resource routing if this is something you need as the generator can not handle this.
Upvotes: 159
Reputation: 9348
You are definitely on the right track. If you add the post_id
column when generating the Comment
scaffold your relationship will then work (although you still need to add the has_many :comments
and belongs_to :post
)
So the updated generator call would look like this:
rails g scaffold Comment body:string author:string post_id:integer
Upvotes: 9