如何覆盖匹配正则表达式的所有方法

时间:2014-02-07 11:42:43

标签: ruby regex

我有一个类和一个模块(名称因安全问题而被更改)

class Model < ActiveRecord::Base
  include Identifier
  ...
end

module Identifier
  def self.included base
    base.instance_eval do

    def find(*args)
      #new find implementation
    end
  end
end

目标:  我已经重新编写了find方法,可以通过除id之外的其他方法进行搜索,但我还需要覆盖原始类中的每个关联setter方法。

样品:

def child_model_id=(value)
  #body of the override method
end

免责声明:我知道这一般是黑客和邪恶的,但这是一个遗留项目,我别无他法。

有没有办法覆盖模块中以“_ id =”结尾的原始类的所有方法?

2 个答案:

答案 0 :(得分:1)

您可以通过调用instance_methods来获取类的实例方法。

class Foo
  def bar
  end

  def bar_id
  end

  instance_methods(false).grep(/.+_id=$/) # => [:bar_id]
  #                 ^^ get only own methods (not inherited object_id, for example)
end

你已经知道的其余部分。

答案 1 :(得分:1)

我相信你可以在新课程中做这样的事情:

OldClass.instance_methods(false).grep(/_id=?$/).each do |method|
    define_method method do
        # Do what you want in the new method depending upon the method name
        case method
        when 'child_model_id='
           # Do this one
        when 'foo_id'
           # Do that one
        ...
        end
    end
end