2011-06-25 50 views
9

Trong tài liệu hướng dẫn để tải háo hức nó được tuyên bố rằng:Bạn làm cách nào để tải lên với giới hạn?


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:

class Picture < ActiveRecord::Base 
    has_many :most_recent_comments, :class_name => 'Comment', 
            :order => 'id DESC', :limit => 10 
end 

Picture.find (: first,: include =>: most_recent_comments) .most_recent_comments # => trả về tất cả các nhận xét liên quan.


Nếu đây là trường hợp tốt nhất để đạt được "giới hạn" khi tải?

Giả sử chúng tôi đang háo hức tải 10 bài đăng blog cuối cùng lên trang đầu của blog, chúng tôi rõ ràng không muốn tất cả chúng nên giới hạn và thứ tự của bộ sưu tập bài đăng được chỉ định?

Ngoài ra, có thể chỉ định cùng điều kiện cho các yếu tố được tải sâu - ví dụ: chỉ hiển thị ba nhận xét đầu tiên trên mỗi bài đăng trên blog không?

Blog.find(:blog_id, :include => {:posts => :comments }) 
+1

Hãy xem câu trả lời này ... http://stackoverflow.com/questions/9808674/rails-eager-load-and-limit – user1896290

Trả lời

0

Bạn có thể sử dụng xây dựng này: Picture.find(:first, :include => :most_recent_comments).most_recent_comments.limit(10)

Xem thêm tại AR guide

+6

Mẫu bạn đã mô tả không hạn chế truy vấn gốc, chỉ dữ liệu được trả về từ nó. Thách thức là hạn chế truy vấn ban đầu sao cho nó không tải ** tất cả ** bài đăng trên blog vào bộ nhớ –

4

Tôi tin rằng điều này là do lệnh LIMIT trong sql không dịch cũng như những gì bạn đang cố gắng làm. LIMIT sẽ giới hạn tổng số hàng được trả về bởi truy vấn. Bạn không cố gắng làm điều đó. Bạn đang cố gắng giới hạn số lượng hàng được nối cho mỗi bức ảnh được trả lại. Để đạt được ảnh hưởng này, bạn phải sử dụng một số SQL phức tạp, có thể khó tối ưu hóa nếu các bảng của bạn lớn. Tại thời điểm đó tôi sẽ xem xét lý do tại sao bạn đang cố gắng để hạn chế các hàng háo hức nạp.

Nếu số lượng nhận xét tối đa mong muốn được quản lý (< 2000 hoặc lâu hơn), bạn có lẽ không nên lo lắng về việc hạn chế kết thúc SQL.

Nếu bạn chỉ tải 10 bài đăng, tôi sẽ không xem xét tải gì cả. Tôi sẽ không mong đợi thêm 10 truy vấn để làm chậm quá nhiều thứ và thời gian họ đã thêm, bạn có thể bù đắp bằng cách thử các kỹ thuật tối ưu hóa khác như bộ nhớ đệm.

Bạn nên để phạm vi làm công việc bẩn thỉu cho bạn, chứ không phải là sự xác nhận. Điều này thúc đẩy khả năng sử dụng lại, bảo trì, dễ đọc.Ví dụ:

Class Picture < ActiveRecord::Base 
    has_many :comments, :order => 'id DESC' do 
    def recent 
     limit(10) 
    end 
    end 
end 

Bằng cách đó .comments là ở đó khi bạn cần đến nó, và bạn cũng có thể phạm vi nó xuống như thế này:

@picture.comments.recent 
1

tôi đã sử dụng will_paginate để giúp tôi ra cùng với tải háo hức (using includes) như tôi phải tải nhiều mô hình liên quan trong một shot mà không sử dụng limit

Image.includes(:user,:tags).where("user_id !=?",current_user.id).paginate(:page => params[:page], :per_page => 15) 

OR (không will_paginate (sử dụnglimit)

Image.includes(:user,:tags).where("user_id !=?",current_user.id).limit(30).order("created_at ASC") 

... cho nó một try..hope nó giúp.

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