紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【N+1問題対策】Ransackとincludesメソッドを使ってActiveRecordの多段の関連を検索する方法 #Rails5

f:id:yokoyantech:20181029174950p:plain

はじめに

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