Как сделать ссылку на EmbeddedDocument в MongoMapper? - PullRequest
1 голос
/ 04 ноября 2011

Я не очень уверен в этом дизайне схемы (предложения приветствуются), но у меня есть две коллекции:

  • Бизнес
  • Клиент

и каждый из них содержит вложенные документы:

  • предприятия содержат события
  • Клиенты содержат регистрации

Определения классов приведены ниже, но сначала вопрос. Когда я создаю Бизнес и добавляю Событие, все выглядит хорошо. Когда я создаю Заказчика и добавляю Регистрацию, все выглядит хорошо. На данный момент я могу сделать:

ruby-1.9.2-p180 :380 > customer1.registrations.first.customer
 => #<Customer _id: BSON::ObjectId('4eb22a5bbae7a01331000019'), business_id: BSON::ObjectId('4eb215a9bae7a01331000001'), registrations: nil> 

Отлично! Но потом ... Я добавляю Регистрацию к Событию, используя event1.registrations << registration1, и теперь event1 имеет другую ссылку customer в зависимости от того, получаю ли я доступ к ней через Событие или через Клиента:

ruby-1.9.2-p180 :444 > customer1.registrations.first.customer
 => #<Customer _id: BSON::ObjectId('4eb22a5bbae7a01331000019'), business_id: BSON::ObjectId('4eb215a9bae7a01331000001'), posts: nil> 

ruby-1.9.2-p180 :445 > business1.events.first.registrations.first.customer
 => #<Event _id: BSON::ObjectId('4eb21ab2bae7a0133100000f'), business_id: BSON::ObjectId('4eb215a9bae7a01331000001'), posts: nil> 

ruby-1.9.2-p180 :446 > business1.events.first.registrations.first == customer1.registrations.first
 => true 

Не идеально ... я думаю, что дубликаты registration1 были встроены в customer1 и event1? То, что я хотел, было связями между Событием и его многочисленными Регистрациями (которые принадлежат и встроены в Клиентов). Возможно ли это с помощью этой схемы?

Вот так выглядят мои модели. Все они имеют дополнительные (и неактуальные) клавиши, которые не отображаются:

class Business
  include MongoMapper::Document

  many :events
  many :customers
end

class Event
  include MongoMapper::EmbeddedDocument

  embedded_in :business

  many :registrations
end

class Customer
  include MongoMapper::Document

  belongs_to :business
  key :business_id, ObjectId

  many :registrations
end

class Registration
  include MongoMapper::EmbeddedDocument

  embedded_in :customer

  belongs_to :event
  key :event_id, ObjectId
end

1 Ответ

1 голос
/ 04 ноября 2011

Да. Registration - это MongoMapper::EmbeddedDocument, поэтому он всегда встроен. Это означает, что как Customer, так и Event имеют many :registrations, различные объекты регистрации будут встроены в каждый.

В MongoMapper embedded_in :customer просто псевдоним customer для возврата родительского документа. Это просто причудливый способ позвонить _parent_document. Вот почему клиент регистрации вашего события является объектом события. ( См. Источник здесь ).

Эмпирическое правило должно вставляться только тогда, когда ребенок всегда будет использоваться в контексте его родителя.

...