Доста се борих с точно същия проблем в приложение с огромно количество редове и след като изпробвах различни нови решения като странични съединения и подзаявки, най-ефективното и най-простото решение беше просто да добавя чужд ключ към таблицата, който сочи към последния ред и използвайте обратно извикване на асоцииране (или 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
асоциация.