如何链接到MongoMapper中的EmbeddedDocument?

时间:2011-11-04 05:42:36

标签: mongodb mongomapper

我对这种架构设计不太满意(建议欢迎),但我有两个集合:

  • 商业
  • 客户

并且每个都包含嵌入文档:

  • 企业包含活动
  • 客户包含注册

类定义如下,但首先是问题。当我创建一个商家并添加一个事件时,一切看起来都很好。当我创建客户并添加注册时,一切看起来都很好。此时,我可以这样做:

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引用,具体取决于我是通过事件还是通过客户访问它:< / p>

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 

不完美....我最好的猜测是,registration1customer1中都嵌入了event1的重复项?我想要的是Event和它的许多注册之间的链接(它们是拥有并嵌入在Customers中)。这种架构可以实现吗?

这就是我的模特的样子。它们都有其他(和不相关的)未显示的键:

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 个答案:

答案 0 :(得分:1)

是的。 RegistrationMongoMapper::EmbeddedDocument,因此它始终是嵌入的。这意味着因为CustomerEvent都有many :registrations,所以每个都会嵌入不同的注册对象。

在MongoMapper中,embedded_in :customer只是别名customer方法来返回文档的父级。这只是一种调用_parent_document的方式。这就是为什么您的活动的注册客户是一个事件对象。 (See source here)。

rule of thumb仅在孩子将始终用于其父级的上下文时才会嵌入。