gpt4 book ai didi

ruby-on-rails - Mongoid store_in 产生随机结果

转载 作者:可可西里 更新时间:2023-11-01 09:09:07 25 4
gpt4 key购买 nike

我正在使用 Rails 3.2.2 和 mongoid 2.4.6。为了保持我的集合较小,我使用“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 中的错误吗?

最佳答案

我花了一段时间才找到答案。我决定发布它,希望它能帮助其他人。

Mongoid 实现了一种称为“单表继承”的东西。一旦从父类派生出子类,子类就会存储在父集合中并添加“类型”属性。使用“store_in”明确告诉 mongodb 将文档存储在哪个集合中。在子类中定义 store_in 使 mongoid 存储给定集合中的所有内容(包括父类)。我想为每个 child 使用专门的 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

关于ruby-on-rails - Mongoid store_in 产生随机结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10704310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com