【问题标题】:Mongoid store_in produces random resultsMongoid store_in 产生随机结果
【发布时间】:2012-05-29 01:53:09
【问题描述】:

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

class BaseClass
  include Mongoid::Document
end

class ChildClass1 < BaseClass
  store_in :child_1
end  

class ChildClass2 < BaseClass
  store_in :child_2
end

对象似乎随机存储在 or 或其他子集合中。 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?我相信它目前是 2.4.10。

标签: ruby-on-rails mongodb inheritance mongoid multiple-inheritance


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2014-01-02
    相关资源
    最近更新 更多