我对这种架构设计不太满意(建议欢迎),但我有两个集合:
并且每个都包含嵌入文档:
类定义如下,但首先是问题。当我创建一个商家并添加一个事件时,一切看起来都很好。当我创建客户并添加注册时,一切看起来都很好。此时,我可以这样做:
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
不完美....我最好的猜测是,registration1
和customer1
中都嵌入了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
答案 0 :(得分:1)
是的。 Registration
是MongoMapper::EmbeddedDocument
,因此它始终是嵌入的。这意味着因为Customer
和Event
都有many :registrations
,所以每个都会嵌入不同的注册对象。
在MongoMapper中,embedded_in :customer
只是别名customer
方法来返回文档的父级。这只是一种调用_parent_document
的方式。这就是为什么您的活动的注册客户是一个事件对象。 (See source here)。
rule of thumb仅在孩子将始终用于其父级的上下文时才会嵌入。