読者です 読者をやめる 読者になる 読者になる

N+1問題を検出してくれるgem、bulletを導入する

Railsで作ったプロジェクトを開発環境で動かしていくと、ある一覧ページを表示する度にすごい量のSELECTが発行されているように見え、先輩に相談!

「N+1問題」というものを教えていただきました。
N+1問題 / Eager Loading とは - Rails Webook

解決策

以下のページを参考にしました。
ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い - Qiita

そもそもN+1問題はログを眺めていないと気づけないのでは…?と思ったところ、素敵なgemがあること先輩に教えていただきました!
それが「bullet」です。
GitHub - flyerhzm/bullet: help to kill N+1 queries and unused eager loading

導入手順

導入は下記ページを参考にしました。
» Railsライブラリ紹介: N+1問題を検出する「bullet」 TECHSCORE BLOG

Gemfileにbulletを追加
(開発環境でのみ使用する)

group :development do
  # Access an IRB console on exception pages or by using <%= console %> in views
  gem 'web-console', '~> 2.0'
  gem 'thin'
  gem 'rails_best_practices'
  gem 'bullet'

  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
end

bundleコマンドを実行し、gemをインストールする

$ bundle
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies...
Using rake 10.5.0
Using i18n 0.7.0
・・・略・・・
Using sass-rails 5.0.4
Using web-console 2.3.0
Installing uniform_notifier 1.9.0
Installing bullet 5.0.0
Bundle complete! 15 Gemfile dependencies, 67 gems now installed.
Bundled gems are installed into ./vendor/bundle.

開発環境のconfigにbullet用の設定を追加する
(config/environments/development.rbというファイルに下記の記述を追加する)

  config.after_initialize do
    Bullet.enable = true
    Bullet.alert = true
    Bullet.bullet_logger = true
    Bullet.console = true
    Bullet.rails_logger = true
  end

railsサーバーを再起動する
(再起動しないとbulletが使えない)

再起動してN+1問題のクエリが発行されるページへアクセスすると、下記のようなポップアップが表示されるようになる

f:id:maetoo11:20160314212116p:plain:w500

どこの処理で発生したかに加え対処方法をきちんと教えてくれるので、対処が簡単になりました(∩´∀`)∩ワーイ