Z dokumentacji Rails 5.0 i wielkich.
Guide
Dwukierunkowy stowarzyszenia
To normalne dla stowarzyszenia do pracy w dwóch kierunkach, wymagające deklaracji na dwóch różnych modelach:
class Author < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :author
end
Domyślnie Active Record robi” t wiedzieć o związku między tymi powiązaniami. Może to prowadzić do dwóch kopii obiektu coraz zsynchronizowane:
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
Dzieje się tak dlatego, że i b.author są dwie reprezentacje różnią się w pamięci z tych samych danych, a żadna z nich jest automatycznie odświeżany od zmian inny. Active Record zapewnia: inverse_of opcję, aby można było poinformować ją o tych relacjach:
class Author < ApplicationRecord
has_many :books, inverse_of: :author
end
class Book < ApplicationRecord
belongs_to :author, inverse_of: :books
end
z tymi zmianami, Active Record będzie ładować tylko jedną kopię obiektu autora, zapobiegając niespójności i co aplikacja bardziej efektywne:
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
Istnieje kilka ograniczeń do inverse_of wsparcia:
one nie działają: poprzez stowarzyszenia. Nie działają z: stowarzyszenia polimorficzne. Nie działają z: as association.
Dla asocjacji belongs_to, has_many asocjacji odwrotnych są ignorowane. Każde skojarzenie będzie próbowało automatycznie znaleźć powiązanie odwrotne i ustawić opcję: inverse_of heurystycznie (na podstawie nazwy asocjacji). Większość skojarzeń z nazwami standardowymi będzie obsługiwana.Jednak związki, które zawierają następujące opcje nie będą już ich odwrotności ustawić automatycznie:
- : warunki
- : poprzez
- : polimorficznych
- : foreign_key
Czy rozumiesz komentarz w dokumentacji: "dla belongs_to association has_many asocjacji odwrotnych są ignorowane.". A jednak doktor używa tego dokładnego przykładu. Czego tu mi brakuje? – dynex
Nie jestem do końca pewien. 'inverse_of' nie ma zbyt dużego zastosowania, więc może to być zachowanie, które nie jest dobrze zdefiniowane. Próbowałem go używać po wskazaniu tej funkcji i tak naprawdę nie zrobiło dla mnie nic pożytecznego. – tadman
To wszystko jest dla mnie bardzo dziwne, ponieważ wydaje mi się, że zawsze chcesz tego zachowania domyślnie, i tylko trzeba użyć: inverse_of, gdy nazwa skojarzenia nie może być wywnioskowane. Również niespójności w definicji są uciążliwe, ale pomogło mi to w kilku przypadkach. Jakiś powód, dla którego nie powinienem trzymać go wszędzie? – Ibrahim