2009-07-26 62 views
4
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和singleton_class.class_eval的用途是什麼?

爲什麼在這裏需要singleton_class.send

爲什麼class_eval調用singleton_class而不是self

回答

4

使用「singleton_class」的原因是因爲您不想修改ActiveRecord :: Base類,而是修改Product類。

約metaptogramming和單例類在這裏

更多信息:http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html

+0

這種滅絕_why鏈接的存檔版本:http://web.archive.org/web/20090615044849/http://whytheluckystiff.net/articles/seeingMetaclassesClearly .html – jordanpg 2012-01-28 23:35:19

相關問題