【问题标题】:Rails class inheritance, Mongoid fails to return dataRails类继承,Mongoid返回数据失败
【发布时间】:2014-11-09 18:47:39
【问题描述】:

使用这些模型:

models/asset.rb

class Asset < Entity
     include Mongoid::Document
end

模型/资产/text.rb

module Assets
    class Text < Asset
        include Mongoid::Document
        store_in collection: "#{tenant_uuid}_contents"
    end
end

Rails 控制台返回:

Entity.all.entries

MOPED: 127.0.0.1:27017 QUERY database=dbname collection=entities selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3572ms) []

资产.所有条目

MOPED:127.0.0.1:27017 QUERY database=dbname collection=2b66d7a9-8cb5-4802-838a-f1f58869bbf5_contents selector={"$query"=>{"_type"=>{"$ in"=>["Asset"]}}, "$orderby"=>{"_id"=>1}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.9501ms) []

但如果我再次执行 Entity.all.entries(即在 Asset.all.entries 之后),我会得到不同的响应:

Entity.all.entries

MOPED: 127.0.0.1:27017 QUERY database=dbname collection=2b66d7a9-8cb5-4802-838a-f1f58869bbf5_contents selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=零字段=零(3.2308ms)

MOPED: 127.0.0.1:27017 GET_MORE .... 所有文件都在这里返回

如果我删除 Asset 继承自 Entity 的事实,那么

Assets.all.entries

总是第一次工作并返回所有文档。

所以我对这里的继承链有些不理解。或者实体没有存储在内容集合中的事实 - 它就像一个“抽象”类(实体类被存储在各自集合中的其他对象继承)。

那么这里的问题是Mongoid不能支持这样的继承结构吗?我们是否必须将 Entity 与其子项存储在同一个集合中?

提前致谢。

【问题讨论】:

  • 请提供实体的模型定义。
  • @GaryMurakami 抱歉,但我现在有了答案,同一个问题的链接比我描述的更好:)

标签: ruby-on-rails inheritance mongoid


【解决方案1】:

这似乎是一个众所周知的“问题”。实际上这是设计使然。

这里是作者twonotes

Mongoid 的继承功能作为单一集合继承和 因此继承链中的所有模型都将存储在同一个 集合 - 如果它改变一个,它就会改变所有。

类似情况here。关于如何解决这个问题的建议,同样来自作者,是mixin modules rather than inheritance

如果你想在模型之间有共同的功能,但有它们 存储在您应该使用模块的不同集合中,而不是 继承。

HTH!

【讨论】:

  • 非常感谢您提供的信息,您的“HTH”确实如此:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多