Jeg kæmpede en del med nøjagtig det samme problem i en applikation med en enorm mængde rækker, og efter at have prøvet forskellige nye løsninger som laterale sammenføjninger og underforespørgsler var den bedst ydende og langt enkleste løsning bare at tilføje en fremmednøgle til tabellen, der peger til den seneste række og brug et tilknytningsopkald (eller en db-trigger ) for at indstille fremmednøglen.
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 skinner virkelig, hvis mængden af tilknyttede poster er enorm, som det var i mit tilfælde, da du ivrig kan indlæse den seneste post uden de hukommelsesproblemer, der opstår, hvis du indlæser hele has_many
forening.