Posted over 9 years ago. Visible to the public. Repeats.

Rails: When to use :inverse_of in has_many, has_one or belongs_to associations

When you have two models in a has_many, has_one or belongs_to association, the :inverse_of option in Rails tells ActiveRecord that they're two sides of the same association.

Example with a has_many / belongs_to association:

Copy
class Forum < ActiveRecord::Base has_many :posts, inverse_of: :forum end class Post < ActiveRecord::Base belongs_to :forum, inverse_of: :posts end

Knowing the other side of the same association Rails can optimize object loading so forum and forum.posts[0].forum will reference the same object in memory, instead of loading another copy of the same record.

Please read this great section about bi-directional associations Archive from the Rails API for details.

Rails >= 4

Starting from Rails 4 the inverse_of is tried to be determined automatically, but it has some caveats and doesn't work in all cases.

If you don't want to know the details, just set :inverse_of in all cases.

If you want to minimize your code, always set inverse of if you use any option.

You can find out if the inverse_of is set correctly:

Copy
Forum.reflect_on_association(:posts).has_inverse? # => false # missing and needs to be set manually Forum.reflect_on_association(:posts).has_inverse? # => :forum # looks good

Below there are some known options where a automatically determination of the inverse is not working:

Rails < 4

You should always use the :inverse_of option in Rails < 4.

makandra has been working exclusively with Ruby on Rails since 2007. Our laser focus on a single technology has made us a leader in this space.

Owner of this card:

Avatar
Henning Koch
Last edit:
6 months ago
by Henning Koch
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Henning Koch to makandra dev
This website uses short-lived cookies to improve usability.
Accept or learn more