Trochę zmagałem się z dokładnie tym samym problemem w aplikacji z ogromną liczbą wierszy i po wypróbowaniu różnych nowatorskich rozwiązań, takich jak łączenia boczne i podzapytania, najlepszym i zdecydowanie najprostszym rozwiązaniem było dodanie klucza obcego do tabeli, który wskazuje do ostatniego wiersza i użyj wywołania zwrotnego asocjacji (lub wyzwalacz db ), aby ustawić klucz obcy.
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 })
Naprawdę błyszczy, jeśli ilość powiązanych rekordów jest tak duża, jak w moim przypadku, ponieważ możesz szybko załadować najnowszy rekord bez problemów z pamięcią, które występują, jeśli załadujesz cały has_many
stowarzyszenie.