2010-05-27 72 views
0

我创建了一个实例方法,它也是一个回调(如果有意义的话),它实现了一些无关紧要的东西。我很想能够只要致电:将类方法添加到ActiveRecord :: Base

class Model < ActiveRecord::Base 
    fix_camelcase_columns 
end 

相反,此刻我有这样的:

def after_find 
    self.class.columns.each do |column| 
    self.instance_eval("def #{column.name.to_underscore}; self.#{column.name}; end;") 
    end 
end 

我很想摘要,并将其用于其他类。任何指针?

回答

2

好了,你可以打开ActiveRecord::Base扔有一个方法:

class ActiveRecord::Base 
    def self.fix_camelcase_columns 
    define_method :after_find do 
     ... 
    end 
    end 
end 

更清洁的方式,创建一个模块:

module CamelcaseFixer 
    def self.included(base) 
    base.extend(self) 
    end 

    def fix_camelcase_columns 
    define_method :after_find do 
     ... 
    end  
    end 
end 

,然后在你的模型做

class Model < ActiveRecord::Base 
    include CamelcaseFixer 
    fix_camelcase_columns 
end 

没有测试代码,看看它是否工作。

+0

美丽!谢谢!我正在接近猴子补丁,但这更好! – stuartc 2010-05-27 13:21:09

+0

伟大的解决方案和解释。 – 2010-05-27 15:53:34

相关问题