大量の行があるアプリケーションでまったく同じ問題にかなり苦労しました。横方向の結合やサブクエリなどのさまざまな新しいソリューションを試した後、最もパフォーマンスが高く、はるかに簡単なソリューションは、ポイントするテーブルに外部キーを追加することでした。最新の行に移動し、関連付けコールバック(またはdbトリガー> )外部キーを設定します。
class AddLatestEmploymentToEmployees < ActiveRecord::Migration[6.0]
def change
add_reference :employees, :latest_employment, foreign_key: { to_table: :employments }
end
end
class Employee < ActiveRecord::Base
has_many :employments, after_add: :set_latest_employment
belongs_to :latest_employment,
class_name: 'Employment',
optional: true
private
def set_latest_employment(employment)
update_column(:latest_employment_id, employment.id)
end
end
Employee.joins(:latest_employment)
.where(employments: { status: :active })
has_many
全体をロードした場合に発生するメモリの問題なしに最新のレコードを熱心にロードできるため、私の場合のように関連するレコードの量が膨大な場合は本当に輝いています。 協会。