Differences Between Has_one and Belongs_to in Ruby on Rails
When getting started with Ruby on Rails, associations between models can become quite confusing especially when there’s a thin line between two of them.
At first we’re tempted to use the one that makes more sense when thinking about it… For instance we can say that a page belongs to a book, but we could say that a page has one book too. The two of them establish a one-to-one association between both models.
But the question we need to ask ourselves here is: in which model do I want the foreign key to be? In fact, this is the slight difference between has_one
and
belongs_to
in Ruby on Rails.
belongs_to
will place the foreign key in the declaring model whereas has_one
will place it in the other model.
Let’s see some examples, first using belongs_to
.
1 2 3 4 5 6 |
|
This will use a book_id field in the pages table (note: of course you need to add that field with a migration).
It also adds 4 methods in the Page class: book
, book=
, build_book
, create_book
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
To make this a one-to-many association just declare the other side of it.
1 2 3 4 5 6 7 |
|
Now a book has many pages (and each page still belongs to a book) and you can use the usual methods on the book:
pages
, pages<<
, pages.find
, pages.build
, pages.create
and many more.
If we use a has_one
association, here what happens:
1 2 3 4 5 6 |
|
Here are some examples:
1 2 3 4 5 6 7 8 9 10 11 |
|
You will probably want to set the other side of the association at some point.
1 2 3 4 5 6 7 |
|
But that way a book can only have one page…
To sum things up: use belongs_to
when you want the foreign key in the declaring model, use has_one
if you want it on the other model.
But anyway, you will rarely see a belongs_to
or a has_one
used alone. Most of the time it will be has_many
with belongs_to
for a one-to-many
association and has_one
with belongs_to
for a one-to-one association.