J'ai eu un peu de mal avec exactement le même problème dans une application avec une énorme quantité de lignes et après avoir essayé diverses nouvelles solutions comme les jointures latérales et les sous-requêtes, la solution la plus performante et de loin la plus simple consistait simplement à ajouter une clé étrangère à la table qui pointe à la dernière ligne et utilisez un rappel d'association (ou un déclencheur db ) pour définir la clé étrangère.
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 })
Cela brille vraiment si la quantité d'enregistrements associés est énorme, comme c'était le cas dans mon cas, car vous pouvez charger avec impatience le dernier enregistrement sans les problèmes de mémoire qui se produisent si vous chargez l'intégralité de has_many
association.