【问题标题】:Generate a ruby class in memory在内存中生成一个 ruby​​ 类
【发布时间】:2013-01-18 02:29:20
【问题描述】:

我需要将 ActiveRecord 模型类自动转换为 MongoDB 文档类。我可以使用 rails 生成器来执行此操作,该生成器将读取模型的属性并生成新的 document.rb。

如果 ActiveRecord 模型类如下所示:

class Project < ActiveRecord::Base
  attr_accessible :completed, :end_date, :name, :start_date
end

那么,一个生成的类与 Mongoid 的结构确认如下:

class ProjectDocument
  field :name, type: String
  field :start_date, type: Date
  field :end_date, type: Date
  field :completed, type: Boolean
  field :created_at, type: Time
  field :updated_at, type: Time
end

但我不想存储不同的文档文件,每个模型一个。每当启动 rails 应用程序时,我都希望能够即时生成此文档类。

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

【问题讨论】:

  • 使用 :end 作为访问器或字段名是个坏主意
  • 糟糕,点了。这只是示例代码;不在任何地方使用它。调整了问题。

标签: ruby-on-rails ruby ruby-on-rails-3 mongoid metaprogramming


【解决方案1】:

我的第一次尝试看起来像这样:

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

您几乎可以肯定必须做一些更复杂的事情才能正确设置字段类型,但这应该会给您一个很好的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2020-06-06
    • 2011-01-10
    • 2014-04-24
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多