Tôi đã phải vật lộn khá nhiều với cùng một vấn đề trong một ứng dụng có rất nhiều hàng và sau khi thử các giải pháp mới khác nhau như các phép nối bên và truy vấn con, hoạt động tốt nhất và giải pháp đơn giản nhất là chỉ cần thêm một khóa ngoại vào bảng trỏ đến hàng mới nhất và sử dụng lệnh gọi lại liên kết (hoặc trình kích hoạt db ) để đặt khóa ngoại.
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 })
Nó thực sự tỏa sáng nếu số lượng bản ghi liên quan là rất lớn như trong trường hợp của tôi vì bạn có thể tải bản ghi mới nhất mà không gặp sự cố bộ nhớ xảy ra nếu bạn tải toàn bộ has_many
liên kết.