Jag kämpade ganska mycket med exakt samma problem i en applikation med en enorm mängd rader och efter att ha provat olika nya lösningar som laterala sammanfogningar och subqueries var den bästa och absolut enklaste lösningen bara att lägga till en främmande nyckel i tabellen som pekar till den senaste raden och använd en associationsuppringning (eller en db-utlösare ) för att ställa in den främmande nyckeln.
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 })
Det lyser verkligen om mängden associerade poster är enorma som det var i mitt fall eftersom du gärna kan ladda den senaste posten utan minnesproblemen som uppstår om du laddar hela has_many
förening.