2012-06-11 2 views
5

Мне нужно создать класс Ruby на лету, то есть динамически, который происходит от ActiveRecord::Base. Я использую eval до поры до времени:Создание класса Ruby на лету без eval

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

Есть ли эквивалент, и по крайней мере, столь же кратким способом сделать это без использования eval?

ответ

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" 
14

Вы можете использовать Class класс, какие классы являются экземплярами. Еще не запутались? ;)

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

cls.new 
+0

Это он, спасибо. Я знаю, что классы тоже объекты; но я не знал, что можно дать базовый класс в качестве аргумента и, в частности, о блоке (оглядываясь назад, я должен был догадаться). – DrTom

Смежные вопросы