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

问题描述 投票:0回答:1

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

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

谢谢。

ruby-on-rails ruby mongoid
1个回答
5
投票

来自精细手册

多态性

当子嵌入文档可以属于多种类型的父文档时,您可以通过在父文档的定义中添加

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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.