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:
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 Show archive.org snapshot 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:
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:
-
:conditions
,:through
and:foreign_key
: See the Ruby On Rails Guide Show archive.org snapshot and theINVALID_AUTOMATIC_INVERSE_OPTIONS
constant for each Rails version respectively (e.g. for Rails v5.2.3 Show archive.org snapshot ). -
:as
: Association to polymorphic model does not determine inverse_of automatically.
Rails < 4
You should always use the :inverse_of
option in Rails < 4.