2013-03-06 6 views

risposta

32

In una relazione semplice, due modelli possono essere solo correlati in un unico modo e il nome della relazione è automaticamente il nome del modello a cui è correlato. Questo va bene nella maggior parte dei casi, ma non sempre è sufficiente.

inverse_of consente di specificare la relazione a cui ci si sta riferendo. Questo è utile nei casi in cui desideri utilizzare nomi personalizzati per le tue relazioni. Ad esempio:

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 questo esempio, gli utenti possono sia richiedere che essere assegnati ai ticket. Per rappresentare queste due relazioni distinte, è necessario definire due relazioni con lo stesso modello ma con nomi diversi. L'utilizzo di inverse_of consente a Mongoid di sapere che "richieste" corrispondono a "requester" e "assegnazioni" a "worker". Il vantaggio qui è duplice, possiamo usare nomi significativi per la nostra relazione e possiamo avere due modelli correlati in più modi. Consulta la documentazione di Mongoid Relations per informazioni più dettagliate.

+2

Quindi non ho bisogno di '' 'inverse of''' se c'è una sola relazione con nome personalizzato ma ho bisogno di due relazioni con nomi personalizzati? Ora che in ActiveRecord '' 'inverse_of''' faccio cose diverse. – freemanoid

+2

Sì, per una singola relazione con un nome personalizzato, è necessario solo utilizzare 'class_name' (sia in Active Record che in Mongoid). Se 'users' e' requests' sono correlati in più di un modo, 'inverse_of' è l'unico modo in cui Mongoid (e Active Record) potrebbero sapere a quale ti stai riferendo. – XanderStrike