2012-06-11 17 views
5

Ho bisogno di creare una classe Ruby al volo, cioè dinamicamente, che deriva da ActiveRecord::Base. Io uso eval per il momento:Creazione di una classe Ruby al volo senza eval

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

Esiste un equivalente, e almeno altrettanto modo conciso per fare questo senza usare eval?

risposta

4

Naturalmente, c'è :)

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

È possibile utilizzare la classe Class, di cui le classi sono casi. Confuso ancora? ;)

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

cls.new 
+0

Questo è, grazie. So che anche le classi sono oggetti; ma non sapevo che è possibile dare la classe base come argomento e in particolare riguardo al blocco (a ben vedere, avrei dovuto indovinarlo). – DrTom