Mongoid:创建嵌入的运行时模型

时间:2012-08-01 18:01:19

标签: ruby-on-rails runtime mongoid models embedding

在我的应用程序中,我们必须在运行时创建模型,并将它们嵌入到当前模型中。这些创建的模型也可以反过来嵌入模型。为了获得这些可嵌入模型的共同点,我创建了一个可以包含在其中的模块。

例如:

module CommonMethods
  def make_self(context)
    if context['nested']
      inner_klass_name = context['name'].classify
      inner_klass = Object.const_set(inner_klass_name, Class.new)
      inner_klass.class_eval <<-ENDSRC
        include Mongoid::Document
        include CommonMethods

        embedded_in :#{@mclass_name.underscore}, :inverse_class_name => "#{@mclass_name}"

        after_initialize :start_make_self

        def start_make_self
          @mclass_name = "#{inner_klass_name}"
          make_self(#{context['nested_context']})
        end
      ENDSRC

      self.class_eval <<-ENDSRC
        embeds_one :#{context['name']}, :inverse_class_name => "#{inner_klass_name}"
      ENDSRC
    else
      self.class_eval <<-ENDSRC
        field :#{context['name']}, :type => String
      ENDSRC
    end
  end
end

class MModel
  include Mongoid::Document
  include CommonMethods

  field :context_id, :type => String
  after_initialize :start_make_self

  def start_make_self
    context = Context.where(:uid => self.context_id)
    @mclass_name = "MModel"
    make_self(context.attributes)
  end
end

因此,MModel及其嵌入文档的字段是在Context模型的帮助下完成的。

这里的问题是,虽然制作了非嵌套字段,并且可以动态验证,但嵌套(嵌入)模型似乎有问题:当创建新的MModel时,它们不会被初始化,并将数据传递给它。第一级可以工作,低于它的任何级别都不会。

有关此的任何提示吗?

0 个答案:

没有答案