2012-06-11 30 views
5

Tôi cần tạo một lớp Ruby ngay lập tức, tức là động, có nguồn gốc từ ActiveRecord::Base. Tôi sử dụng eval cho thời gian được:Tạo một Lớp Ruby ngay lập tức mà không cần eval

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

Có tương đương, và ít nhất không kém cách súc tích để làm điều này mà không sử dụng eval?

Trả lời

4

Tất nhiên, 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

Bạn có thể sử dụng lớp Class, trong đó các lớp học những trường. Bối rối chưa? ;)

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

cls.new 
+0

Đây là lời cảm ơn. Tôi biết rằng các lớp học cũng là các đối tượng; nhưng tôi không biết rằng có thể cung cấp cho các lớp cơ sở như một đối số và đặc biệt là về khối (trong hindsight, tôi nên đã đoán). – DrTom

Các vấn đề liên quan