Ik worstelde nogal wat met exact hetzelfde probleem in een applicatie met een enorm aantal rijen en na het proberen van verschillende nieuwe oplossingen zoals laterale joins en subquery's was de best presterende en verreweg de eenvoudigste oplossing gewoon om een externe sleutel toe te voegen aan de tabel die wijst naar de laatste rij en gebruik een associatie-callback (of een db-trigger ) om de externe sleutel in te stellen.
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 })
Het schijnt echt als het aantal gekoppelde records enorm is, zoals in mijn geval, omdat je de nieuwste record graag kunt laden zonder de geheugenproblemen die optreden als je de hele has_many
laadt associatie.