2013-03-06 14 views

Odpowiedz

32

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.

+2

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

+2

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