Ruby on rails 在内存中生成ruby类

Ruby on rails 在内存中生成ruby类,ruby-on-rails,ruby,ruby-on-rails-3,mongoid,metaprogramming,Ruby On Rails,Ruby,Ruby On Rails 3,Mongoid,Metaprogramming,我需要将ActiveRecord模型类自动转换为MongoDB文档类。我可以使用rails生成器来实现这一点,它将读取模型的属性并生成新的document.rb 如果ActiveRecord模型类如下所示: class Project < ActiveRecord::Base attr_accessible :completed, :end_date, :name, :start_date end 但我不想存储不同的文档文件,每个模型一个。我希望能够在rails应用程序启动时动态生成

我需要将ActiveRecord模型类自动转换为MongoDB文档类。我可以使用rails生成器来实现这一点,它将读取模型的属性并生成新的document.rb

如果ActiveRecord模型类如下所示:

class Project < ActiveRecord::Base
  attr_accessible :completed, :end_date, :name, :start_date
end
但我不想存储不同的文档文件,每个模型一个。我希望能够在rails应用程序启动时动态生成这个文档类


这可能吗?是否建议使用这种从内存生成和使用类的方法?我对AR模型结构的更改没有限制;文档是灵活的w.r.t数据结构,更改的列将自动添加。

我的第一次尝试如下所示:

klass = Project
new_class = Object.const_set(klass.name + "Document", Class.new)
klass.columns.each do |c|
  new_class.class_eval do
    field c.name.to_sym, type: c.type
  end
end

几乎可以肯定,要正确设置字段类型,您必须执行更复杂的操作,但这应该为您提供一个良好的起点

使用end作为访问器或字段名是个坏主意。这只是示例代码;不在任何地方使用它。调整了问题。
klass = Project
new_class = Object.const_set(klass.name + "Document", Class.new)
klass.columns.each do |c|
  new_class.class_eval do
    field c.name.to_sym, type: c.type
  end
end