Интроспекция цепочки вызова методов ActiveRecord::BaseDmitrii Samoilov

Недавно захотелось разобраться, какие методы вызываются при вызове конкретного метода отнаследованного от ActiveRecord::Base класса.

Поэтому я придумал небольшой хак для вывода названия метода при его вызове:

module ActiveRecord
  Base.singleton_methods.each do |m|
    Base.class_eval <<-EOS
      class << self
        puts "redefining #{m}"

        define_method "#{m}_with_introspection" do |*args|
          puts "#{m}"
          send(:"#{m}_without_introspection", *args)
        end

        alias_method :"#{m}_without_introspection", :"#{m}"
        alias_method :"#{m}", :"#{m}_with_introspection"
      end
    EOS
  end
end

Можно подключить этот код через какой-нибудь init.rb/environment.rb файл, чтобы он загружался при старте проекта или можно просто запускать его руками из irb сессии.

Вот пример использования в irb:

NB: Можно применять этот хак не только для класса ActiveRecord::Base, но и для всех классов/модулей со сложной структурой вызовов метода.

Можно легко доработать этот код не только для вывода названия метода, но и для вывода аргументов и тд.

Комментарии
Mikhailov Anatoly

идея супер, реализацию можно чуть-чуть подукрасить

alias_method_in_chain "#{m}", "introspection"
Dmitrii Samoilov

да, можно и так, только тогда уж alias_method_chain :"#{m}", :"#{introspection}"

Пожалуйста авторизуйтесь, чтобы добавить комментарий. Вход