两种不同的模型嵌入相同的模型

时间:2015-01-22 19:32:42

标签: ruby-on-rails ruby mongoid

我有两个非常相似的系列。两者之间的唯一区别是一个(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

这不符合我的预期。有没有办法实现我想要的或改变细节文档在每个集合中有不同的名称是唯一的解决方案? :

感谢。

1 个答案:

答案 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