Ich hatte ziemlich viel mit genau demselben Problem in einer Anwendung mit einer großen Anzahl von Zeilen zu kämpfen, und nachdem ich verschiedene neuartige Lösungen wie laterale Joins und Unterabfragen ausprobiert hatte, bestand die leistungsstärkste und bei weitem einfachste Lösung darin, der Tabelle einen Fremdschlüssel hinzuzufügen, der zeigt in die letzte Zeile und verwenden Sie einen Assoziations-Callback (oder einen DB-Trigger ), um den Fremdschlüssel festzulegen.
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 })
Es glänzt wirklich, wenn die Menge der verknüpften Datensätze so groß ist wie in meinem Fall, da Sie eifrig den neuesten Datensatz laden können, ohne die Speicherprobleme, die auftreten, wenn Sie den gesamten has_many
laden Verein.