OKADA LABO

[Ruby on Rails]n+1問題

アソシエーションは便利だが、
処理で問題が発生する場合がある

たとえば、

モデルsamplesがあるとして

 

samples_controller.rb
samplesテーブルのレコード新しい順に全取得

def index
 @samples = Sample.order("created_at DESC")
end

 

viewファイル
views/samples/index.html.erbで

<% @samples.each do |sample| %>
処理
<% end %>

 

の中に
アソシエーション記述の取得があった場合、

 

each doで1件1件取得して、なおかつその処理の中で
アソシエーションで取得されるから
動きに無駄がある。
これがn+1問題。

 

samples_controller.rbでアソシエーション先の情報も取得して
viewに渡すようにしたい
たとえばアソシエーションでuserテーブルのレコードを取得の場合

samples_controller.rb

def index
 @samples = Sample.order("created_at DESC")
end

def index
 @samples = Sample.includes(:user).order("created_at DESC")
end

と書きかえればよい。

 

.includesは指定された関連モデルをまとめて取得するメソッド。
書き方は、includes(:モデル名)と記述します。
アソシエーション関連モデルをシンボル型で引数に記述します。