0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している 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 クエリ問題を自動で検知できる点は、アプリケーションの品質向上に直結します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?