Co oznacza inverse_of
w mongoidowych skojarzeniach? Co mogę uzyskać, używając go zamiast po prostu bez niego?Co inverse_of oznacza w mongoid?
Odpowiedz
W prostej relacji dwa modele mogą być powiązane tylko w jeden sposób, a nazwa relacji jest automatycznie nazwą modelu, z którym jest powiązana. W większości przypadków jest to w porządku, ale nie zawsze wystarcza.
inverse_of
pozwala określić relację, do której się odwołujesz. Jest to przydatne w przypadkach, gdy chcesz używać niestandardowych nazw dla swoich relacji. Na przykład:
class User
include Mongoid::Document
has_many :requests, class_name: "Request", inverse_of: :requester
has_many :assignments, class_name: "Request", inverse_of: :worker
end
class Request
include Mongoid::Document
belongs_to :requester, class_name: "User", inverse_of: :requests
belongs_to :worker, class_name: "User", inverse_of: :assignments
end
W tym przykładzie użytkownicy mogą zarówno żądać, jak i być przypisani do biletów. Aby przedstawić te dwie odrębne relacje, musimy zdefiniować dwie relacje z tym samym modelem, ale o różnych nazwach. Używanie inverse_of
pozwala Mongoid'owi wiedzieć, że "prośby" dotyczą "requester", a "assignments" - "worker". Przewaga jest tutaj dwojaka, możemy używać znaczących nazw dla naszej relacji i możemy mieć dwa modele powiązane na wiele sposobów. Zapoznaj się z dokumentacją Mongoid Relations, aby uzyskać bardziej szczegółowe informacje.
Więc nie potrzebuję "odwrotności", jeśli istnieje tylko jedna relacja z niestandardową nazwą, ale potrzebuję w przypadku dwóch relacji z niestandardowymi nazwami? Teraz, w ActiveRecord '' 'inverse_of''' robią coś innego. – freemanoid
Tak, dla pojedynczej relacji z niestandardową nazwą, potrzebujesz tylko użyć 'nazwa_klasy' (zarówno w Active Record, jak i Mongoid). Jeśli 'users' i' requests' są powiązane na więcej niż jeden sposób, 'inverse_of' jest jedynym sposobem, w jaki Mongoid (i Active Record) może wiedzieć, do którego odnosisz się. – XanderStrike