在我的应用程序中,我们必须在运行时创建模型,并将它们嵌入到当前模型中。这些创建的模型也可以反过来嵌入模型。为了获得这些可嵌入模型的共同点,我创建了一个可以包含在其中的模块。
例如:
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
时,它们不会被初始化,并将数据传递给它。第一级可以工作,低于它的任何级别都不会。
有关此的任何提示吗?