[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(:モデル名)と記述します。
アソシエーション関連モデルをシンボル型で引数に記述します。