LoginSignup
6
10

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-20

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

6
10
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
6
10