2013-03-06 27 views

Trả lời

32

Trong một mối quan hệ đơn giản, hai mô hình chỉ có thể liên quan theo một cách duy nhất và tên của mối quan hệ tự động là tên của mô hình mà nó liên quan đến. Điều này là tốt trong hầu hết các trường hợp, nhưng không phải lúc nào cũng đủ.

inverse_of cho phép bạn chỉ định mối quan hệ mà bạn đang đề cập đến. Điều này rất hữu ích trong trường hợp bạn muốn sử dụng tên tùy chỉnh cho các mối quan hệ của bạn. Ví dụ:

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 

Trong ví dụ này, người dùng có thể vừa yêu cầu vừa được chỉ định vé. Để đại diện cho hai mối quan hệ riêng biệt này, chúng ta cần định nghĩa hai quan hệ với cùng một mô hình nhưng với các tên khác nhau. Sử dụng inverse_of cho phép Mongoid biết rằng "yêu cầu" đi cùng với "người yêu cầu" và "bài tập" đi cùng với "công nhân". Lợi thế ở đây là gấp đôi, chúng ta có thể sử dụng các tên có ý nghĩa cho quan hệ của chúng ta, và chúng ta có thể có hai mô hình liên quan theo nhiều cách. Xem tài liệu Mongoid Relations để biết thêm thông tin chi tiết.

+2

Vì vậy, tôi không cần '' 'nghịch đảo của ''' nếu chỉ có một quan hệ với tên tùy chỉnh nhưng tôi cần trong trường hợp có hai quan hệ với tên tùy chỉnh? Tôi bây giờ trong ActiveRecord '' 'inverse_of''' làm điều khác nhau. – freemanoid

+2

Có, đối với một mối quan hệ đơn lẻ với tên tùy chỉnh, bạn chỉ cần sử dụng 'class_name' (trong cả Bản ghi Hoạt động và Mongoid). Nếu 'users' và' requests' có liên quan nhiều hơn một cách, 'inverse_of' là cách duy nhất Mongoid (và Active Record) có thể biết bạn đang nhắc đến cái nào. – XanderStrike