n+1問題
- モデルを利用してデータベースの情報にアクセスする際にはSQLが発行されます。SQLが発行されるたびにデータベースに対して通信が走るので、SQLが大量に発行されれば処理が重くなります。n+1問題とは、データを呼び出す際に大量のSQLが発行されてしまう問題のことです。
- 今回の場合、indexアクションで全ツイートを取得する1回に加えて、アソシエーションを利用してツイートの数だけユーザー情報を呼び出しています。つまり、現在の状態だとapp数+1回SQLが発行されています。この状態のことをn+1問題と言います。
includesメソッド
- includesメソッドはn+1問題を解消することができる。
- 指定された関連モデルをまとめて取得することで、SQLの発行回数を減らすことができる。
- 書き方は、
includes(:モデル名)
- appsテーブルのレコードは必ず1つのusersテーブルのレコードに属しているので、includesメソッドを利用することでappsテーブルのレコードを取得する段階で関連するusersテーブルのレコードも一度に取得することができる。
apps_controller.rb
class TweetsController < ApplicationController
def index
@tweets = Tweet.includes(:user).page(params[:page]).per(5).order("created_at DESC")
end
#以下省略
end