2009-07-26 7 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 

Je voudrais comprendre comment set_table_name est défini dans cet exemple. Pourquoi faut-il utiliser singleton_class.send ici?Quel est le but de singleton_class.send & singleton_class.class_eval dans cet exemple de métaprogrammation?

Et pourquoi class_eval est-il appelé singleton_class au lieu de self?

Répondre

4

La raison de l'utilisation de "singleton_class" est que vous ne souhaitez pas modifier la classe ActiveRecord :: Base, mais la classe Product.

En savoir plus sur metaptogramming et classe singleton ici: http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html

+0

version archivée de ce lien _why éteint: http://web.archive.org/web/20090615044849/http://whytheluckystiff.net/articles/seeingMetaclassesClearly .html – jordanpg

+0

Et la version non-archivée ici: http://dannytatom.me/metaid/ – alfasin

Questions connexes