N+1問題とは
アソシエーションを利用した場合にDBへのアクセスが多くなってしまう問題のことです。
対策をしていないとアプリケーションのパフォーマンスの低下に繋がってしまいます。
例)
users テーブル
Column | Type | Options |
---|---|---|
nickname | string | null: false |
Associations | ||
has_many :tweets |
tweets テーブル
Column | Type | Options |
---|---|---|
comment | string | null: false |
user_id | integer | |
Associations | ||
belongs_to :user |
ツイートが複数存在する一覧画面に、それぞれユーザー名を表示する場合、tweetsに関連するusersの情報の取得に、ツイート数と同じ回数のアクセスが必要になります。(投稿が1万ある場合は1万回以上DBにアクセスすることになります。)
includeメソッドを使用する
includeメソッドを使用することで引数に指定された関連するモデルを一度のアクセスで取得することができます
#モデル名.includes(:紐づくモデル名)
Tweet.includes(:user)
引数に関連するモデルをシンボル型で記入します。
このように記述することで、
1:tweetsのすべてのデータを取得する
2:tweetsテーブルに紐づくusersテーブルのデータを取得
2度のアクセスだけて情報を取得することができます。