Luché bastante con exactamente el mismo problema en una aplicación con una gran cantidad de filas y después de probar varias soluciones novedosas como uniones laterales y subconsultas, la solución de mejor rendimiento y, con mucho, la más simple fue simplemente agregar una clave externa a la tabla que apunta a la última fila y use una devolución de llamada de asociación (o un db trigger ) para establecer la clave externa.
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 })
Realmente brilla si la cantidad de registros asociados es enorme, como lo fue en mi caso, ya que puede cargar con entusiasmo el último registro sin los problemas de memoria que ocurren si carga todo el has_many
asociación.