2012-06-11 7 views
5

Ich muss eine Ruby-Klasse im laufenden, dynamisch erstellen, die von ActiveRecord::Base abgeleitet ist. Ich benutze eval einstweilen:Erstellen einer Ruby-Klasse im laufenden Betrieb ohne Eval

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

Gibt es ein Äquivalent, und mindestens ebenso prägnante Art und Weise diese eval ohne zu tun?

Antwort

4

Natürlich gibt 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

Sie die Class Klasse verwenden können, von denen Klassen Instanzen sind. Verwirrt noch? ;)

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

cls.new 
+0

Das ist es, danke. Ich weiß, dass Klassen auch Objekte sind; aber ich wusste nicht, dass es möglich ist, die Basisklasse als ein Argument und insbesondere über den Block zu geben (im Nachhinein hätte ich es erraten sollen). – DrTom

Verwandte Themen