【初心者】N+1問題を発見!Bulletの使い方


N+1問題とは

扱うデータの数に比例して発行されるSQLの数が増えること。
この問題はパフォーマンスに影響を与えるので解決したい問題。
よく聞く例えとして、買い物でたくさん商品を買った際にお会計を1点づつしかやってくれない状態がN+1問題です。

bulletとは

「N+1問題」を見つけてくれるライブラリです。

導入方法

Gemfile
group :development do
  gem 'bullet'
end

bundle installします。
設定します。

config/environments/development.rb

Rails.application.configure do 
 #途中省略

  config.after_initialize do
    Bullet.enable = true #Bullet gemを有効
    Bullet.alert = true #ブラウザにJavaScriptアラートをポップアップ
    Bullet.bullet_logger = true #Bulletログファイル(Rails.root/log/bullet.log)に記録
    Bullet.console = true #警告をブラウザーのconsole.logに記録
    Bullet.rails_logger = true #警告を直接Railsログに追加
  end
end

解決方法

bulletを使うと警告画面とログが出てきます。

例えば、ユーザーと投稿の関係を1対多にします。

user.rb
class User < ApplicationRecord
  has_many :posts
end
post.rb
class Post < ApplicationRecord
  belongs_to :user
end

全ての投稿に対するユーザー名を出力します。

Post.all.each do |post|
  puts post.user.name
end
USE eager loading detected
Psot => [:user]
Add to your finder::incluedes => [:user]

このようなログや警告メッセージが出てきます。
そこで、

Post.inculudes(:user).each do |post|
  puts post.user.name
end

とすればOKです。