我有一个类和一个模块(名称因安全问题而被更改)
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 =”结尾的原始类的所有方法?
答案 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