2012-06-11 14 views
5

Potrzebuję utworzyć klasę Ruby w locie, tj. Dynamicznie, która pochodzi z ActiveRecord::Base. Używam eval na razie:Tworzenie klasy Ruby w locie bez ewaluacji

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

Czy istnieje odpowiednik, a przynajmniej równie zwięzły sposób to zrobić bez użycia eval?

Odpowiedz

4

Oczywiście, istnieje :)

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

Można użyć klasy Class, z których zajęcia są przypadki. Mylić jeszcze? ;)

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

cls.new 
+0

To wszystko, dziękuję. Wiem, że klasy też są obiektami; ale nie wiedziałem, że można podać klasę podstawową jako argument, aw szczególności o bloku (z perspektywy czasu, powinienem był się domyślić). – DrTom