2011-06-30 22 views
6

Soy nuevo en mongo/mongoid y estoy tratando de configurar una relación de autorreferencia en mi tabla de sitios.MongoDB mongoid self reference relationship

# sites model 

has_many :child_sites, :class_name => 'Site' 
belongs_to :parent, :class_name => 'Site' 

#controller 

@event = current_site.child_sites.build(params[:site]) 

current_site es una función que devuelve el objeto de sitio actual.

me sale este error -

indefinidos método `entradas para #

+0

No estoy seguro de cuál es su problema específico, pero este no es un esquema muy amistoso. Tenga en cuenta que las "relaciones" como concepto no existen en mongodb, por lo que lo anterior daría lugar a una gran cantidad de consultas (el controlador deberá consultar por separado cada "relación"). –

+0

Gracias por el asesoramiento, ¿cuál es la mejor manera de crear un sitio principal que tenga un sitio secundario? – Alex

Respuesta

13

Usted puede intentar cambiar las definiciones de relación con los siguientes:

has_many :child_sites, :class_name => 'Site', :cyclic => true 
belongs_to :parent_site, :class_name => 'Site', :cyclic => true 

no lo hago sé exactamente lo que hace, pero recuerdo que se discutió en el grupo de Mongoid google. Si eso no funciona, debe intentar establecer inverse_of en las macros de relación. La mayoría de las veces configurando inverse_of correctamente hace el trabajo.

has_many :child_sites, :class_name => 'Site', :inverse_of => :parent_site 
belongs_to :parent_site, :class_name => 'Site', :inverse_of => :child_sites 

Sobre las consultas adicionales, sí que habría consultas adicionales cada vez que se desea obtener child_sites de un sitio o el sitio principal de un sitio.

Debería considerar incrustar sitios secundarios en el sitio primario, pero tenga en cuenta que perderá la posibilidad de consultar sitios secundarios de forma independiente. Siempre tendrá que acceder a cualquier sitio secundario como "parent_site> child_sites".

Tenga también en cuenta el límite de 16 MB del tamaño del documento, que es difícil de alcanzar, pero podría ser posible si hay muchos sitios secundarios para un padre y si está almacenando información de plantilla, como html, css, etc. en el documento mismo.

4

Cyclic se implementó originalmente para documentos incrustados (see user group entry). Para hacer este trabajo sobre MongoId 2.3 o superior que tenga que quitar la opción cíclica:

has_many :child_sites, :class_name => 'Site' 
belongs_to :parent_site, :class_name => 'Site'