2012-06-11 40 views
5

Necesito crear una clase de Ruby sobre la marcha, es decir, dinámicamente, que se deriva de ActiveRecord::Base. Yo uso eval por el momento:Crear una clase de Ruby sobre la marcha sin eval

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

¿Hay un equivalente, y por lo menos igual forma concisa a hacer esto sin usar eval?

Respuesta

4

Por supuesto, no es :)

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

Usted puede utilizar la clase Class, de las cuales las clases son instancias. ¿Confundido todavía? ;)

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

cls.new 
+0

Esto es todo, gracias. Sé que las clases también son objetos; pero no sabía que es posible dar a la clase base un argumento y, en particular, sobre el bloque (en retrospectiva, debería haberlo adivinado). – DrTom

Cuestiones relacionadas