Rails: When to use :inverse_of in has_many, has_one or belongs_to associations
When you have two models in a
belongs_to association, the
:inverse_of option in Rails tells ActiveRecord that they're two sides of the same association.
Example with a
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.posts.forum will reference the same object in memory, instead of loading another copy of the same record.
Please readfrom the Rails API for details.
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:
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:
:foreign_key: See the and the
INVALID_AUTOMATIC_INVERSE_OPTIONSconstant for each Rails version respectively.
:as: Association to polymorphic model does not determine inverse_of automatically.
You should always use the
:inverse_of option in Rails < 4.
Flaky tests are tests that sometimes fail for no obvious reason. They are the plague of many end-to-end (E2E) test suites that automate the browser through tools like Capybara and Selenium.
Join our free training event and learn to fix any flaky test suite, even in large legacy applications.