MongoDB mongoid自我引用关系

时间:2011-06-30 13:56:34

标签: mongodb mongoid

我是mongo / mongoid的新手,我正在尝试在我的网站表上设置自引用关系。

# 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是一个返回当前站点对象的函数。

我收到此错误 -

  

的未定义方法`entries'

3 个答案:

答案 0 :(得分:13)

您可以尝试将关系定义更改为以下内容:

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

我不确切知道它的作用,但我记得在Mongoid google小组中讨论过它。如果这不起作用,您应该尝试在两个关系宏上设置inverse_of。大部分时间设置inverse_of都能正确完成工作。

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

关于额外的查询,是的,每当您想要获取站点的child_sites或站点的父站点时,都会有额外的查询。

您应该考虑在父网站中嵌入子网站,但请记住,您将无法以独立方式查询子网站。您始终必须以“parent_site> child_sites”的形式访问任何子站点。

还要记住文档大小的16MB限制,这很难达到,但如果父母有很多子站点,并且存储模板信息,如html,css等,则可能会出现这种限制。在文件中。

答案 1 :(得分:4)

Cyclic最初是为嵌入式文档(see user group entry)实现的。要使其在mongoid 2.3或更高版本上运行,您必须删除循环选项:

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

答案 2 :(得分:2)

你不能使用recursively_embeds_manyrecursively_embeds_one吗? http://mongoid.org/en/mongoid/docs/relations.html#common

相关问题