2015-10-16 15 views
6

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?

Trả lời

3

Có một lưu ý giấu đi trong associations documentation dưới "bốc háo hức của các hiệp hội":

Nếu bạn tải háo hức một hiệp hội với một quy định: Tùy chọn giới hạn, nó sẽ bị bỏ qua, trả lại tất cả các đối tượng liên quan .

Vì vậy, hành vi được coi là tài liệu mặc dù đó có thể không phải là hành vi trực quan.

Công việc xung quanh là không phải mong muốn tải giới hạn được liên kết và truy cập riêng sau đó. Khi bạn chỉ ra rằng đó không phải là lý tưởng nhưng nó gần như chắc chắn là thích hợp hơn để tải tất cả các đối tượng liên quan mà không có một giới hạn.

+0

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

+2

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

Các vấn đề liên quan