2013-03-29 4 views
0

Скажем, у меня есть модель mongoid под названием Foo, которая вставляет много баров.Самостоятельные референтные вложенные документы с использованием Mongoid

Я хотел бы создать связь, в которой Bar связывается с ней. Отношения всегда будут касаться двух документов, которые встроены в один и тот же документ Foo. Кажется, я не могу этого сделать, не обращая внимания на то, что вы называете отношения. Я попытался

belongs_to :discovered_by, :class_name => 'Bar' 

, а также

has_one :discovered_by, :class_name => 'Bar' 

Хотя discovered_by идентификатор устанавливается в документе Бар и указывая на другой Bar документа, когда я пытаюсь и сделать следующее я получаю ноль (при условии, что первый бар первого Foo имеет множество discovered_by_id)

Foo.first.bars.first.discovered_by 

Это всегда будет возвращать ноль, несмотря на doucment, имеющего идентификатор набора. Любая идея о том, почему это происходит? Спасибо за любую помощь.

ответ

1

Вы cannot have references to embedded models - даже если они оба встроены в один и тот же документ. Если правильно настроить отношения

belongs_to :discovered_by, :class_name => 'Bar', inverse_of: :discovered 
has_one :discovered, :class_name => 'Bar', inverse_of: :discovered_by 

Mongoid поднимет Mongoid::Errors::MixedRelations исключение. Возможно, вы могли бы пересмотреть, если вложение этих объектов по-прежнему является лучшим выбором. Обходной путь заключается в сохранении только идентификатора и запроса родительского объекта:

class Bar 
    include Mongoid::Document 
    embedded_in :foo 
    field :discovered_by_id, type: Moped::BSON::ObjectId 

    def discovered_by 
     foo.bars.find(discovered_by_id) if discovered_by_id 
    end 

    def discovered_by=(bar) 
     self.discovered_by_id = bar.id 
    end 
end 
+0

Я думаю, что мне придется хранить идентификатор, как вы предложили, в своем решении. Не идеальный, но он поддерживает мою цель. Было сказано, что ваш комментарий о пересмотре встроенных документов интересен. Является ли это против «mongo way» делать что-то, чтобы думать о двух документах, которые встроены в один и тот же родительский документ, как это связано? Полагаю, это будет соответствовать реализации Монгоида. – Stewart

+1

Да, в общем, это плохая идея иметь ссылки на встроенные документы. Частично с технической точки зрения (объект, использующий отношение, должен знать объект родителя для каждого слоя встроенных моделей) и проектной точки зрения (вложенные объекты должны быть доступны только через их родителя). Тем не менее, ваш пример - это пример края: вы определенно знаете родительский объект записи, к которой вы обращаетесь ('foo'). Я бы, вероятно, пошел обходным путем - единственный недостаток заключается в том, что вы не можете использовать стандартные 'own_to' и' has_one' помощники. – 2013-03-30 08:31:47

Смежные вопросы