##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です。