ActiveRecordは必要になるまでDB読み込みをしません。
なのでやたら複雑なビューの中でクエリを弄ったり、コントローラーが肥大化してる状態でひどいSQLがログに流れてくると、パっと見ではどこが原因なのかすぐに分からない。
なので、SQLが実行された時にそれが実際にトリガーされたソースコードの位置も一緒にログに吐いてくれるgemを作りました。
bulletで分からないような、ビューのループの中で直接モデル読んでるみたいなヤバイ箇所を速やかに見つけるためのものです。
仕組み的にはActiveRecordのロギングの仕組みを丸パクリしてcaller_locationsを足した感じ。
全ての読み込み位置を表示するわけではなく正規表現でマッチするパスを持ったソースコードの位置のみをログに記録します。
Railsで利用する場合は自動的にapp
直下を対象にしています。
設定はこんな感じ。
ActiveModel::Cause.match_paths = [Regexp.new(Rails.root.join("lib").to_s)]
ログ出力はこんな感じ。
D, [2015-04-15T22:13:46.928908 #66812] DEBUG -- : User Load (0.1ms) SELECT "users".* FROM "users"
D, [2015-04-15T22:13:46.929038 #66812] DEBUG -- : User Load (ActiveRecord::Cause) caused by /Users/joker/srcs/activerecord-cause/spec/activerecord/cause_spec.rb:16:in `block (3 levels) in <top (required)>'
追記:
リリース後にRails4.2で動かないバグを発見したので修正してバージョンアップしてます。
3.2環境では完璧に動いていたんで気付いてませんでした。 (御察しください)