Из документации Rails 5.0 и выше.
Guide
Двунаправленные ассоциации
Это нормально для ассоциацийработать в двух направлениях, требуя декларирования для двух разных моделей:
class Author < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :author
end
По умолчанию Active Record не знает о связи между этими ассоциациями.Это может привести к потере синхронизации двух копий объекта:
a = Author.first
b = a.books.first
a.first_name == b.author.first_name # => true
a.first_name = 'Manny'
a.first_name == b.author.first_name # => false
Это происходит потому, что a и b.author - это два разных представления в памяти одних и тех же данных, и ни одно из них автоматически не обновляется изменяется на другой.Active Record предоставляет опцию: inverse_of, чтобы вы могли сообщить ей об этих отношениях:
class Author < ApplicationRecord
has_many :books, inverse_of: :author
end
class Book < ApplicationRecord
belongs_to :author, inverse_of: :books
end
С этими изменениями Active Record загрузит только одну копию объекта автора, предотвращая несоответствия и делая ваше приложение более эффективным:
a = Author.first
b = a.books.first
a.first_name == b.author.first_name # => true
a.first_name = 'Manny'
a.first_name == b.author.first_name # => true
Существует несколько ограничений поддержки inverse_of:
Они не работают с: через ассоциации.Они не работают с: полиморфными ассоциациями.Они не работают с: как с ассоциациями.
Для ассоциаций принадлежат_, обратные ассоциации has_many игнорируются.Каждая ассоциация будет пытаться автоматически найти обратную ассоциацию и установить эвристическую опцию: inverse_of (на основе имени ассоциации).Большинство ассоциаций со стандартными именами будут поддерживаться.Однако для ассоциаций, содержащих следующие параметры, обратные установки не будут установлены автоматически:
- : условия
- : до
- : полиморфное
- :Foreign_key