Stefan Bossbaly
Stefan Bossbaly

Reputation: 6794

Create relationships when scaffolding

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

Answers (3)

Jeremy Lynch
Jeremy Lynch

Reputation: 7210

You can also use belongs_to like this:

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

Upvotes: 3

JamieD
JamieD

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

agmin
agmin

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

Related Questions