嵌入式和无嵌入式文档同时进行

时间:2012-04-13 12:36:49

标签: mongodb mongoid

我需要一个表现得像嵌入式而非嵌入式的模型。

例如,如果我想将此模型存储为嵌入式:

class MenuPosition
  include Mongoid::Document
  field :name, type: String
  field :category, type: String

我需要添加

  embedded_in :menu

到它。

另一方面,如果我在模型中添加此行,则无法将此模型存储为未嵌入:

position = {
            "name" => "pork",
            "category" => "meal",
            "portion" => 100
        }
MenuPosition.create(position)

错误消息:

NoMethodError:
       undefined method `new?' for nil:NilClass

我可以将一个模型用于嵌入式和非嵌入式文档吗?

1 个答案:

答案 0 :(得分:0)

在我们的项目中,我们有类似的事情。我们所做的是将字段定义为模块。有点像这样:

module SpecialFields
  extend ActiveSupport::Concern

  included do
    field :my_field, type: String
    field :my_other_field, type: String
  end
end

然后在您想要嵌入的班级中,执行:

include SpecialFields

在您的课程中,您希望将其作为非嵌入式文档单独存储,请执行以下操作:

class NotEmbeddedDoc
  include Mongoid::Document

  include SpecialFields
end

在我们的项目中,这很好用。但是,它可能不适合你的情况,因为你想嵌入很多。这只适用于嵌入我认为的一个案例。我已经将它发布在这里,以防人们使用。