Mongoid store_in产生随机结果

我正在使用Rails 3.2.2和mongoid 2.4.6。 为了保持我的集合小,我使用“store_in”语句将子对象存储在sepparate集合中的基类中。 我的代码如下所示:

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中的错误?

我花了一段时间,但我想出了答案。 我决定发布它,希望它能帮助别人。

Mongoid实现了一种称为“单表inheritance”的东西。 只要从父类派生子类,子项就会存储在父集合中,并添加“type”属性。 使用“store_in”可以明确地告诉mongodb将文档存储在哪个集合中。在子类中定义store_in会使mongoid存储给定集合中的所有内容(包括父项)。 我想使用一个专门的store_in任务为每个孩子混淆mongoid up。 但是,结果是文档随机存储在任何给定的集合中。

这可以在Ruby中使用模块作为mixin来解决,以实现通用function。 在本文档中对此进行了很好的描述。

但毕竟我决定不这样做! 我想要这个的原因是为了保持我的collections量小,希望获得更好的性能。 在与一些(10gen)专家交谈后,我认为更好的方法是对所有子元素使用单父对象集合。 应该对mongodb的性能没有影响,但解决方案变得更加灵活。 事实上,这可以更好地利用mongodb中的无模式设计。

所以代码将再次显示如下:

 class BaseClass include Mongoid::Document ... shared functionality end class ChildClass1 < BaseClass ...individual functionality... end class ChildClass2 < BaseClass ...individual functionality... end