MongoDB mongoid самоотверженные отношения - PullRequest
6 голосов
/ 30 июня 2011

Я новичок в 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 - это функция, которая возвращает текущий объект сайта.

Я получаю эту ошибку -

неопределенный метод `records 'для #

Ответы [ 3 ]

13 голосов
/ 30 июня 2011

Вы можете попробовать изменить определения отношений следующим образом:

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».

Также имейте в виду ограничение размера документа в 16 МБ, которое трудно достичь, но может быть возможным, если имеется много дочерних сайтов для родителя и если вы храните информацию о шаблонах, например html, css и т. Д. в самом документе.

4 голосов
/ 10 января 2012

Cyclic изначально был реализован для встроенных документов ( см. Запись группы пользователей ).Чтобы это работало на mongoid 2.3 или выше, вы должны удалить циклическую опцию:

has_many :child_sites, :class_name => 'Site'
belongs_to :parent_site, :class_name => 'Site'
2 голосов
/ 26 сентября 2012

Не можете ли вы использовать recursively_embeds_many или recursively_embeds_one?http://mongoid.org/en/mongoid/docs/relations.html#common

...