Bulletメモ
N+1クエリが実行されているとき、不要なeager loadingが実行されているとき、カウンターキャッシュを利用すべきときに通知してくれるgem。Bullet 6.1.4で確認。
以下のGemをインストールする。
# test環境でも実行するなら、group :development, :testに追加すること
group :development do
gem 'bullet'
end
bin/rails g bullet:install
を実行する。
Would you like to enable bullet in test environment? (y/n)
と聞かれるのでtest環境で有効化させるならy
を入力する。その後、spec/rails_helper.rb
に以下の内容を追加する。
if Bullet.enable?
config.before(:each) do
Bullet.start_request
end
config.after(:each) do
Bullet.perform_out_of_channel_notifications if Bullet.notification?
Bullet.end_request
end
end
ただ、どういったタイミングで検知するのか不明(適当にデータを用意してModel.all.each(&:another_model)
を実行してみたが検知しなかった。development環境では検知する)。
実際にN+1クエリが発行された場合、log/bullet.log
に以下の内容が出力される。development環境でブラウザから操作していた場合、同じ内容のメッセージボックスが表示される。
user: root
USE eager loading detected
モデルクラス名 => [:アソシエーション先]
Add to your query: .includes([:アソシエーション先])
Call stack
/app/app/controllers/xxxs_controller.rb:7:in `block in index'
/app/app/controllers/xxxs_controller.rb:7:in `map'
/app/app/controllers/xxxs_controller.rb:7:in `index'