2013-03-06 6 views

Antwort

32

In einer einfachen Beziehung können zwei Modelle nur auf eine einzige Weise verknüpft werden, und der Name der Beziehung ist automatisch der Name des Modells, auf das sie sich bezieht. In den meisten Fällen ist das in Ordnung, reicht aber nicht immer aus.

inverse_of können Sie die Beziehung angeben, auf die Sie sich beziehen. Dies ist hilfreich, wenn Sie benutzerdefinierte Namen für Ihre Beziehungen verwenden möchten. Zum Beispiel:

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 

In diesem Beispiel können Benutzer Tickets anfordern und zugewiesen werden. Um diese zwei unterschiedlichen Beziehungen darzustellen, müssen wir zwei Relationen zu demselben Modell, aber mit unterschiedlichen Namen definieren. Mit Hilfe von inverse_of kann Mongoid wissen, dass "Anfragen" mit "Anforderer" und "Zuweisungen" mit "Mitarbeiter" gehen. Der Vorteil hier ist zweierlei: Wir können aussagekräftige Namen für unsere Beziehung verwenden, und wir können zwei Modelle in mehrfacher Beziehung zueinander haben. Ausführliche Informationen finden Sie in der Dokumentation Mongoid Relations.

+2

Also brauche ich nicht '' 'inverse of''', wenn es nur eine Beziehung mit benutzerdefinierten Namen gibt, aber ich brauche im Falle von zwei Beziehungen mit benutzerdefinierten Namen? Ich jetzt, dass in ActiveRecord '' inverse_of''' andere Sache tun. – freemanoid

+2

Ja, für eine einzelne Beziehung mit einem benutzerdefinierten Namen brauchen Sie nur 'class_name' (in Active Record und Mongoid). Wenn "Benutzer" und "Anfragen" auf mehrere Arten zusammenhängen, ist "invers_of" die einzige Möglichkeit, wie Mongoid (und Active Record) wissen könnte, auf welche Sie sich beziehen. – XanderStrike