在没有eval的情况下动态创建Ruby类

时间:2012-06-11 12:46:21

标签: ruby metaprogramming eval

我需要动态创建一个Ruby类,即动态地派生自ActiveRecord::Base。我暂时使用eval

eval %Q{
  class ::#{klass} < ActiveRecord::Base
    self.table_name = "#{table_name}"
  end
}

在不使用eval的情况下,是否有相同且至少同样简洁的方法?

2 个答案:

答案 0 :(得分:14)

您可以使用Class类,其中的类是实例。困惑了吗? ;)

cls = Class.new(ActiveRecord::Base) do
  self.table_name = table_name
end

cls.new

答案 1 :(得分:4)

当然,有:)

class Foo
  class << self
    attr_accessor :table_name
  end
end

Bar = Class.new(Foo) do
  self.table_name = 'bars'
end

Bar.table_name # => "bars"