我有两个非常相似的系列。两者之间的唯一区别是一个 (Item1) 比另一个 (Item2) 有更多细节。 两个集合中的文档已经嵌入了“详细”文档:
项目1:
{
"_id" : ObjectId("5461c8f0426f727f16000000"),
"n" : "Name 1",
"detail" : {
"d" : [
"Frank Darabont"
],
"a" : [
"Tim Robbins",
"Morgan Freeman",
"Bob Gunton"
]
}
项目2:
{
"_id" : ObjectId("5461c8f0426f727f16000000"),
"n" : "Name 1",
"detail" : {
"d" : [
"Frank Darabont"
]
}
我想让两个文档中的“详细信息”字段相同。我在同一个应用程序中拥有两个模型 Item1 和 Item2,并且它们都嵌入了“详细信息”。我见过的解决方案是在两个模型中调用不同的
:detail
但这不起作用,因为它在 Item(1|2) 文档中查找不存在的子文档,返回 nil
。我现在是这样的:
class Item1
include Mongoid::Document
embeds_one :detail1, :class_name => "Detail"
field :n
end
class Item2
include Mongoid::Document
embeds_one :detail2, :class_name => "Detail"
field :n
end
但是,为了检索“详细”子文档,我想要类似的东西:
class Item1
include Mongoid::Document
embeds_one :detail, as: :detail1, :class_name => "Detail"
field :n
end
class Item2
include Mongoid::Document
embeds_one :detail, as: :detail2, :class_name => "Detail"
field :n
end
这没有达到我的预期。有没有办法实现我想要的或更改详细文档以在每个集合中具有不同的名称是唯一的解决方案? :
谢谢。
来自精细手册:
多态性
当子嵌入文档可以属于多种类型的父文档时,您可以通过在父文档的定义中添加
选项以及子文档的as
选项来告诉 Mongoid 支持这一点。在子对象上,将存储一个附加字段来指示父对象的类型。polymorphic
它们甚至还包含一个示例(为了清楚起见,省略了非嵌入部分):
class Band
include Mongoid::Document
embeds_many :photos, as: :photographic
end
class Photo
include Mongoid::Document
embedded_in :photographic, polymorphic: true
end
您应该可以这样设置:
class Item1
include Mongoid::Document
embeds_one :detail, as: :detailable
end
class Item2
include Mongoid::Document
embeds_one :detail, as: :detailable
end
class Detail
include Mongoid::Document
embedded_in :detailable, polymorphic: true
end