Ho una situazione in cui ho un documento principale e voglio avere due diversi tipi di documenti incorporati: uno come genitore, e un altro come un bambino con un genitore facoltativo. Per esempio:Mongoide: come implementare una relazione tra i documenti incorporati?
class ParentDoc
include Mongoid::Document
embeds_many :special_docs
embeds_many :special_doc_groupings
end
class SpecialDoc
include Mongoid::Document
embedded_in :parent_doc
belongs_to :special_doc_groupings
end
class SpecialDocGrouping
include Mongoid::Document
embedded_in :parent_doc
has_many :special_docs
end
In questo esempio, SpecialDocs e SpecialDocGroupings possono esistere senza una relazione, o, in alternativa può avere una relazione padre-figlio.
Tuttavia, questo è un'associazione Mongoid valida perché otteniamo questo errore:
Mongoid::Errors::MixedRelations:
Problem: Referencing a(n) SpecialDoc document from the SpecialDocGrouping document via a relational association is not allowed since the SpecialDoc is embedded.
Summary: In order to properly access a(n) SpecialDoc from SpecialDocGrouping the reference would need to go through the root document of SpecialDoc. In a simple case this would require Mongoid to store an extra foreign key for the root, in more complex cases where SpecialDoc is multiple levels deep a key would need to be stored for each parent up the hierarchy.
Resolution: Consider not embedding SpecialDoc, or do the key storage and access in a custom manner in the application code.
non vedo niente di sbagliato con il tipo di associazione che sto cercando di creare, oltre al fatto che si tratta di non supportato da Mongoid.
Come posso implementare questo tipo di associazione da solo?
yaa destra non puoi definire questo tipo di associazione in mongoid per quanto riguarda la tua domanda 'ho implementare questo tipo di associazione me stesso?' Ben aver sentito [estendere] (http://guides.rubyonrails.org/association_basics.html#extend) nell'associazione activerecord puoi implementare qualcosa del genere o estendere se mongoid supporta anche qualcosa del genere (controllerò e ti farò sapere di questo) Cheers – Viren