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'