# class_evalで動的にクラス・メソッドを定義 ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do include SwitchPoint::Connection
# insert, update, deleteメソッドのメソッドを上書き # 中ではwritableなDBにつなぎに行っているかのチェックとクエリー・キャッシュをクリアしてからメソッドを実行 SwitchPoint::Connection::DESTRUCTIVE_METHODS.each do |method_name| alias_method_chain method_name, :switch_point end end end
# run_load_hooks が実行されているのですぐに呼ばれる ActiveSupport.on_load :fuga do puts 'start 2st on load' fuga puts 'end 2st on load' end
# 実行結果 # before run_load_hooks # start 1st on load # fugafuga # end 1st on load # after run_load_hooks # start 2st on load # fugafuga # end 2st on load
コードにちょこちょこ書いていますが、要はActive Support.run_load_hooksが実行されないと呼ばれないし、 Active Support.run_load_hooksが呼ばれれば一緒に実行してくれるということっぽいです。
def alias_method_chain(target, feature) # Strip out punctuation on predicates, bang or writer methods since # e.g. target?_without_feature is not a valid method name. aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1 yield(aliased_target, punctuation) if block_given?
case when public_method_defined?(without_method) public target when protected_method_defined?(without_method) protected target when private_method_defined?(without_method) private target end end