3

我正在使用Rails 3.2.2和mongoid 2.4.6。爲了保持我的集合小,我使用「store_in」語句將子對象存儲到基類中。我的代碼如下所示:Mongoid store_in產生隨機結果

class BaseClass 
    include Mongoid::Document 
end 

class ChildClass1 < BaseClass 
    store_in :child_1 
end 

class ChildClass2 < BaseClass 
    store_in :child_2 
end 

看起來對象會隨機存儲在或其他子集合中。 Child1類型的對象有時存儲在集合Child2中。 下面是我在日誌中看到令人吃驚的事情:

Started POST "/child_class_1" for 127.0.0.1 at 2012-05-22 10:22:51 -0400 
Processing by ChildClass1Controller#create as HTML 

MONGODB (0ms) myproject_development['child_2'].insert.... 

哪裏是從何而來?這是在mongoid,rails或mongodb中的錯誤嗎?

+0

您是否嘗試過更新到Mongoid的最新版本?我相信它目前是2.4.10。 – theTRON

回答

8

我花了一段時間,但我想出了答案。我決定發佈它,希望它能幫助其他人。

Mongoid實現了一種叫做「單表繼承」的功能。只要從父類派生子類,該子項就會存儲在父集合中,並添加一個「類型」屬性。使用「store_in」可以明確告訴mongodb哪個集合存儲文檔。在子類中定義store_in使mongoid將所有內容(包括父級)存儲在給定集合中。我想用專門的store_in爲每個孩子分配mongoid起來。但是,結果是文檔會隨機存儲在任何給定的集合中。

這可以在Ruby中使用模塊作爲mixin來解決,以實現通用功能。這在this document中描述得非常好。

但是我決定不要這麼做!爲什麼我想要這樣做是爲了保持我的收藏小,希望獲得更好的表現。在與一些(10gen)專家交談後,我認爲更好的方法是對所有子元素使用單個父對象集合。 mongodb的性能不應該有任何影響,但解決方案變得更加靈活。實際上,這使得mongodb中的無模式設計得到了更好的使用。

因此,代碼看起來像這樣再次:

class BaseClass 
    include Mongoid::Document 

    ... shared functionality 

end 

class ChildClass1 < BaseClass 
    ...individual functionality... 
end 

class ChildClass2 < BaseClass 
    ...individual functionality... 
end 
+0

謝謝!這讓我把頭髮拉出半天下午。 –