RailsでN+1問題

  • N+1問題

一覧系画面を表示させる際、「全レコード取得 + 各レコードのデータ取得」分だけselect文を実行してしまう。的な問題。
例えばshopとmenuが1対Nの関係のDB構造のとき、以下のコードだと発生する
・sample_controller.rb

class SampleController < ApplicationController
  def index
    @menus = Menu.all
  end
end

・sample.html.erb

<% menus.each do |menu| %>
  <p><%= menu.name %></p>
  <p><%= menu.shop.name %></p>  <--ここでN回selectしてしまう
<% end %>
  • 解決策

最初にshop情報も一緒に取ってくる
・sample_controller.rb

class SampleController < ApplicationController
  def index
    @menus = Menu.includes(:shop).all
  end
end