将类方法添加到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 

我很想抽象出来并将其用于其他课程。 有什么指针吗?

好吧,你可以打开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 

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