我使用Rails3.2.2和Mongoid2.4.6。为了保持我的集合较小,我使用“store_-in”语句将子对象存储到separate集合中的基类中。我的代码如下:

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中的一个bug?

最佳答案

我花了一段时间才找到答案。我决定把它寄出去,希望它能帮助别人。
Mongoid实现了一种称为“单表继承”的东西。从父类派生子类后,子类将存储在父集合中,并添加“type”属性。使用“store-in”显式地告诉mongodb要在哪个集合中存储文档。在子类中定义store_in会使mongoid存储给定集合中的所有内容(包括父项)。我想在每个孩子的作业中使用一个专门的商店会把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

07-24 17:48
查看更多