Tôi đang sử dụng Rails 4.2. Tôi có 3 bảng như sau:Đường ray: `bao gồm` một mối quan hệ `has_many` với` giới hạn`
class Collection < ActiveRecord::Base
has_many :shares
has_many :images, through: :shares
has_many :latest_images, -> { order(created_at: :desc).limit(10) }, class_name: 'Image', through: :shares, source: :image
end
class Share < ActiveRecord::Base
belongs_to :image
belongs_to :collection
end
class Image < ActiveRecord::Base
has_many :shares
has_many :collections, through: :shares
end
Mục tiêu của tôi là chọn một số bộ sưu tập và tải trước 10 thẻ mới nhất của mỗi bộ sưu tập bằng quan hệ latest_images
.
Nếu tôi làm chỉ đơn giản là:
collections = Collection.where(some_condition).includes(:latest_images)
Vấn đề là latest_images sẽ chứa tất cả các thẻ, không chỉ là cuối cùng 10 (thậm chí nếu có một limit(10)
)
collections.first.latest_images.count # => more than 10!!!
Thay vào đó, nếu tôi thêm limit(10)
sau khi tải bộ sưu tập, tôi sẽ gặp sự cố truy vấn N + 1:
collections.each { |collection| collection.latest_images.limit(10).do_something } # N+1 QUERY
Bất kỳ giải pháp nào?
Vì vậy, không có cách nào để háo hức tải dữ liệu đó mà không tải mọi thứ và tránh truy vấn N +1? – ProGM
Không, không sử dụng giao diện arel mà tôi không nghĩ. Bạn có thể viết mã của riêng bạn để làm điều đó tôi đoán nhưng bạn sẽ không nhận được nó miễn phí không may. – Shadwell