Cosa significa inverse_of
nelle associazioni mongoloidi? Cosa posso ottenere usandolo invece di una semplice associazione senza di essa?Che cosa significa inverse_of in mongoid?
risposta
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.
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
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