これは何?
Arproxyを使うと、ActiveRecordが発行したSQLがDB Adapterによって実行される直前をフックすることができます。これによって、カスタマイズしたクエリログを出力したり、どこからクエリが発行されたのかをトレースしたりすることができるようになります。
Arproxyでは、DB Adapterのフック処理を以下のように定義します。これはクエリが実行されるたびにバックトレースを出力する例です。*1
class QueryTracer < Arproxy::Base def execute(sql, name=nil) Rails.logger.debug sql Rails.logger.debug caller(1).join("\n") super(sql, name) end end
上記のプロキシを使う場合は、Railsの config/initializers 以下で以下のような初期化処理を書きます。
Arproxy.configure do |config| config.adapter = "mysql2" # database.yml で指定したDBアダプタの名前です config.use QueryTracer end Arproxy.enable!
丁度、Rackのmiddlewareをuseするのと似た記法です。
これで、ActiveRecordでSQLが実行されるたびに、そのクエリのバックトレースが出力されます。
おわりに
DBのフックを簡単に書けるので、なにかと役に立つと思います。
詳しくは以下のURLを見て下さい。
https://github.com/cookpad/arproxy