はじめに
N+1問題を解消するために、複数の関連を持つModelをincludes
メソッドで解消する方法をメモ。
実行環境
- Rails5.2.0
- Ransack
- Slim
Model定義
User
に持っている名称と、Corporation
に持っている名称を取得したい。
class User < ApplicationRecord has_one :customer, dependent: :destroy class Customer < ApplicationRecord belongs_to :user has_many :points, dependent: :destroy class Point < ApplicationRecord belongs_to :customer belongs_to :corporation class Corporation < ApplicationRecord has_many :points, dependent: :destroy
実装例
Controller
@q = Point.ransack(query) result = @q.result @points = result .includes([{ customer: :user }, :corporation]) .joins([{ customer: :user}, :corporation]) .select("users.user_name, corporations.company_name, points.*")
View(Slim)
検索条件
customer_user
となるのがポイント。
th = sort_link @q, :customer_user_user_name, t("activerecord.attributes.user.user_name")
検索結果表示
- @points.each do |point| tr td = point.customer.user.user_name td = point.corporation.company_name