我有两个非常相似的系列。两者之间的唯一区别是一个(Item1)具有比另一个(Item2)更多的细节。 两个集合中的文档都已嵌入“详细信息”文档:
的Item1 :
{
"_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”。我见过的解决方案是在两个模型中调用:detail
不同但不起作用,因为它在Item(1 | 2)文档中查找不存在的子文档,返回{ {1}}。我现在就这样:
nil
但是,为了检索“detail”子文档,我希望有类似的内容:
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
这不符合我的预期。有没有办法实现我想要的或改变细节文档在每个集合中有不同的名称是唯一的解决方案? :
感谢。
答案 0 :(得分:4)
来自fine manual:
<强>多态性强>
当子嵌入文档可以属于多种类型的父文档时,您可以通过在父项的定义中添加
as
选项以及polymorphic
选项来告诉Mongoid支持此操作对孩子。在子对象上,将存储一个指示父类型的附加字段。
他们甚至包括一个例子(为了清楚起见,遗漏了非嵌入部分):
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