将类方法添加到ActiveRecord :: Base

时间:2010-05-27 12:51:13

标签: ruby-on-rails ruby activerecord

我已经创建了一个实例方法,它也是一个回调(如果这是有意义的),它做了一些不相关的东西。我很乐意能够致电:

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

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

1 个答案:

答案 0 :(得分: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

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