Saya sedikit kesulitan dengan masalah yang sama persis dalam aplikasi dengan sejumlah besar baris dan setelah mencoba berbagai solusi baru seperti penggabungan lateral dan subkueri, solusi berkinerja terbaik dan sejauh ini paling sederhana hanyalah menambahkan kunci asing ke tabel yang menunjuk ke baris terbaru dan gunakan panggilan balik asosiasi (atau pemicu db ) untuk menyetel kunci asing.
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 })
Itu benar-benar bersinar jika jumlah catatan terkait sangat besar seperti dalam kasus saya karena Anda dapat dengan senang hati memuat catatan terbaru tanpa masalah memori yang terjadi jika Anda memuat seluruh has_many
asosiasi.