2011-11-04 42 views
1

我不是這個架構設計(建議表示歡迎)非常有信心,但我有兩個集合:如何鏈接到MongoMapper中的EmbeddedDocument?

  • 業務
  • 客戶

和他們每個人的包含嵌入的文件:

  • 業務包含事件
  • 客戶包含註冊

類的定義如下,但首先是問題。當我創建一個商業並添加一個事件時,一切都很正常。當我創建一個客戶並添加註冊時,一切都很正常。在這一點上,我可以這樣做:

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的重複已經嵌入customer1event1?我想要的是Event和它的許多註冊(這些註冊都屬於客戶)。這種模式可能嗎?

這就是我的模特的樣子。他們都有額外的(不相關的)鍵不顯示:

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

是的。 Registration是一個MongoMapper::EmbeddedDocument,所以它總是嵌入。這意味着因爲CustomerEvent都有many :registrations,所以每個嵌入不同的註冊對象。

在MongoMapper中,embedded_in :customer只是一個customer方法來返回文檔的父級。這只是一種很有趣的方式,叫做_parent_document。這就是爲什麼你的活動的註冊客戶是一個事件對象。 (See source here)。

rule of thumb只是嵌入時,子女將總是在其父母的上下文中使用。

+0

謝謝!這有助於噸...有沒有辦法鏈接到嵌入式文檔呢?可能通過對嵌入式文檔ID進行索引,然後在Event中存儲一個ObjectId數組? – colllin