ActiveRecordが発行するSQLをフックして色々やるためのライブラリArproxyを公開しました

これは何?

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するのと似た記法です。
これで、ActiveRecordSQLが実行されるたびに、そのクエリのバックトレースが出力されます。

おわりに

DBのフックを簡単に書けるので、なにかと役に立つと思います。
詳しくは以下のURLを見て下さい。
https://github.com/cookpad/arproxy

*1: [http://d.hatena.ne.jp/mirakui/20101010/rails_query_trace:title] で紹介したgemと近い挙動をするものです