何をしたか
Railsアプリを作っています。N+1問題
について前々から関心はあったのですが、SQLについて学習が不足していることもあり、自分では気づけないことも多いので、N+1問題が発生している箇所があったら教えてくれるgem bullet
を入れてみることにしました。
▶︎公式のドキュメントはこちら:bullet
導入方法
以下のコードをGemfileに記載します。
group :development do
gem 'bullet'
end
bundle install
後、以下のコマンドを実行します。
bundle exec rails g bullet:install
この時、テスト環境にもbullet
を入れるかどうか聞かれると思いますが、公式のinstall
のところにはdevelop
環境へのインストールだけが記されていたのと、
公式のテスト環境へのインストールの記述を見てみても、なんだか色々大変そうだな(今回はそこまで時間をかける必要はない)だったので、今回は見送りました。
デフォルトで設定される内容
↑上記のコマンドで、config/environments/development.rb
にデフォルトで以下の様なコードが追加されました。
Rails.application.configure do
# ここから
config.after_initialize do
Bullet.enable = true
Bullet.alert = true
Bullet.bullet_logger = true
Bullet.console = true
# Bullet.growl = true デフォルトでコメントアウトされてる
Bullet.rails_logger = true
Bullet.add_footer = true
end
# ここまでが追加される。以下、同ファイルにもとから入っていた内容は省略
end
bulletの設定可能な項目一覧は←こちらにありましたが、デフォルトで入っている項目について確認すると、
-
Bullet.enable
...Bulletのgemを利用可能にします。でも、何もしません。 -
Bullet.alert
...ブラウザにJSのアラートを出します。 -
Bullet.bullet_logger
...bulletのログファイルを出します(場所:Rails.root/log/bullet.log) -
Bullet.console
...console.logに警告を出します。 -
Bullet.growl
...Growl
がインストールされているときに、ポップアップの警告を出します。 -
Bullet.rails_logger
...railsのログに警告を出します。 -
Bullet.add_footer
...画面左下にメッセージを出します。
...なるほどです。
実際の使用画面
直し方まで教えてくれていて便利ですね^^
未解決の問題
users
とimages
の両方のテーブルに対して、N+1
問題が発生していたので、この様に直し...。
#before
@posts = Post.order(created_at: 'DESC')
#after
@posts = Post.includes(:user, :images).order(created_at: 'DESC')
実際に、クエリは減りました。。。。
countがいっぱい回っている、という別の問題があらわになりました
教えていただいて&調べてわかったのですが、これはまた別の問題のようで、こちらの方法で解決できました!
早くSQLに詳しくなってN+1問題も素早く発見&解決&未然に防止できる様になりたいです