class Product < ActiveRecord::Base
set_table_name 'produce'
end
module ActiveRecord
class Base
def self.set_table_name name
define_attr_method :table_name, name
end
def self.define_attr_method(name, value)
singleton_class.send :alias_method, "original_#{name}", name
singleton_class.class_eval do
define_method(name) do
value
end
end
end
end
我想了解在此示例中如何定义set_table_name
。
为什么需要singleton_class.send
?
为什么在class_eval
而不是在singleton_class
上调用self
?
答案 0 :(得分:4)
使用“singleton_class”的原因是因为您不想修改ActiveRecord :: Base类,而是修改Product类。
有关metaptogramming和singleton class的更多信息,请访问:http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html