2014-02-07 2 views
0

я получил класс и модуль (имена изменены по вопросам безопасности)Как переопределить все методы, соответствующие регулярное выражение

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 

Цель: Я уже переписан метод находки, чтобы быть в состоянии для поиска, отличного от ids, но мне также необходимо переопределить все методы настройки ассоциации в исходном классе.

Пример:

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

Отказ от ответственности: Я знаю, что это Hacky и зло в целом, но это наследство проект, и я не получил никакого другого пути вокруг.

Есть ли способ переопределить все методы исходного класса, заканчивающиеся на "_id =" с модуля?

ответ

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 
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 

Остальное, что вы уже знаете.

Смежные вопросы