はじめに
こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
今回は、React × Rails の環境構築中に非常に便利だと感じた bullet
という gem を紹介します。
bullet
は、Rails アプリケーションにおける N+1
クエリ問題 や、不要な eager loading
(事前読み込み) を検出してくれる開発支援ツールです。
パフォーマンス最適化を目的として、開発中に問題のあるクエリを検知し、さまざまな方法で通知してくれます。
本記事では、Bullet
の導入方法から使い方、注意点までを解説します。
導入方法
1. Gemfile に追加(development 環境のみに)
group :development do
gem 'bullet'
end
2. bundle install の実行
$ bundle install
3. development 環境の設定
config/environments/development.rb
に以下の設定を追加します。
Rails.application.configure do
config.after_initialize do
Bullet.enable = true
Bullet.alert = true # JavaScriptのalertで通知
Bullet.bullet_logger = true # log/bullet.logに記録
Bullet.console = true # コンソールに表示
Bullet.rails_logger = true # Railsログに出力
Bullet.add_footer = true # ページ下部に通知を表示
end
end
Bullet が通知する内容
1. N+1 クエリの検出
例えば以下のようなコード:
@posts = Post.all
@posts.each do |post|
puts post.comments.count
end
この場合、各post
ごとにcomments
が都度 DB から取得されるため、N+1 クエリが発生します。Bullet はこれを検出して、includes(:comments)
を追加するよう警告します。
2. 未使用の eager loading
読み込んだ関連データ(例: includes(:comments)
)が実際には使用されていない場合も警告します。無駄な読み込みを避けるためです。
3. Counter Cache を使うべきケース
大量のcount
クエリが発行されている場合、カウンターキャッシュ(例: comments_count
カラム)を利用すべきであると提案されます。
通知の出力方法
Bullet は以下のように通知を出力できます。
- JavaScript の alert
- ブラウザのフッター表示
- Rails ログへの出力
- bullet.log への記録
- ブラウザの JavaScript コンソール
利用上の注意点
- Bullet はあくまで開発環境専用のツールです。本番環境では使用しないでください。
- 完全な検出精度ではないため、開発者自身の判断も必要です。
まとめ
Bullet gem は、開発段階でパフォーマンス問題を早期に発見・修正するための非常に有用なツールです。特に、N+1 クエリ問題を自動で検知できる点は、アプリケーションの品質向上に直結します。