2009-07-24 45 views
13

tải Háo hức là tốt đẹp với các thuộc tính bao gồmRails tải trọng mong muốn?

Post.find(:all, :include => :author) 

Tôi tự hỏi nếu bạn cũng có thể đếm tải háo hức, như thế nào nếu tôi muốn để có được số lượng comment cho mỗi bài đăng, mà không cần nạp tất cả các ý kiến ​​bản thân?

Có lẽ cái gì đó như

Post.find(:all, :include => [:author, "count(comments)") 

Tôi cho rằng tôi có thể sử dụng một cột count_cache. Nhưng làm tất cả trong một bao gồm sẽ thực sự đẹp, nếu nó có thể.

Điểm thưởng bổ sung nếu ai đó có thể cho biết cách không chỉ nhận số, nhưng cũng đặt một số điều kiện, như chỉ đếm các bài đăng đã được phê duyệt.

+0

Điều này sau này được mở rộng trong câu hỏi này: http://stackoverflow.com/questions/4908878/how-do-i-get-rails-to-eager-load-counts Liên quan mạnh mẽ đến: http://stackoverflow.com/questions/2870521/how-will-activerelation-affect-rails-includes-s-capabilities (đó là cách tôi tìm thấy nó.) –

Trả lời

-6

Trong MySQL ít nhất, bạn có thể thực hiện nhanh hơn hai cuộc gọi riêng biệt này vì bạn có thể tránh tham gia. Tôi biết điều này không trả lời câu hỏi của bạn, nhưng nó có vẻ như bạn đang cố gắng để có được tốc độ tốt hơn và làm

Post.find ... 

Sau đó

post.comments.count 

là nhanh hơn và bộ nhớ hiệu quả hơn (đối với cơ sở dữ liệu) hơn nếu bạn truy xuất cả hai trong một truy vấn.

+4

Vâng, một trong những lý do chính để sử dụng tải háo hức là tránh các truy vấn N + 1. – MrTheWalrus

+3

Điều này gây ra một truy vấn N + 1 và không trả lời câu hỏi. – davidgoli

24

chúng đã tự động được nạp sử dụng

post.comments.length 

Tôi đã có vấn đề này cùng vì tôi đã sử dụng .count

+2

Tôi không nghĩ rằng đây là những gì ông đang tìm kiếm. Thao tác này sẽ tải tất cả các mục trong liên kết nhận xét và sau đó đếm chúng. Anh ta muốn sử dụng SQL để háo hức kéo số lượng mà không tải các đối tượng. (Hoặc ít nhất đó là cách tôi hiểu nó). – Mike

+0

Bạn nói đúng Mike. –

+1

Đây là giải pháp tôi đang tìm kiếm. Trên trang chỉ mục của bài đăng mà tôi muốn lặp qua bộ sưu tập và hiển thị số lượng nhận xét - điều này tránh việc yêu cầu tính trong mỗi chu kỳ (Miễn là các nhận xét đã được tải cùng với bài đăng). Cảm ơn :-) – Renra

2

Hãy thử điều này:

Comment.count(:group => :post) 

Để lọc theo điều kiện:

Comment.count(:group => :post, :conditions => {:approved => true }) 

Chúng sẽ trả về các băm với các bài viết dưới dạng các khóa và số lượng các chú thích làm các giá trị.

+0

Nó không chính xác những gì tôi đang tìm kiếm. Có, bạn có thể làm điều đó trong một cuộc gọi riêng biệt như thế này. Nhưng tôi không nghĩ rằng bạn có thể làm chúng trong một hiệp hội như tôi muốn. Có lẽ phải sử dụng cột count_cache. –

3

Xây dựng câu trả lời của avaynshtok, kỹ thuật sau chỉ nên thực hiện 2 cuộc gọi cơ sở dữ liệu.

# ./app/controllers/posts_controller.rb 

def index 
    # First load the posts 
    @posts = Post.all 

    # Then you can load a hash of author counts grouped by post_id 
    # Rails 3 version: 
    @comment_counts = Comment.count(:group => :post_id) 
    # Rails 4 version: 
    # @comment_counts = Comment.group(:post_id).count 
end 

Sau đó, theo quan điểm của bạn

<!-- ./app/views/posts/index.html.erb --> 

<% @posts.each do |post| %> 
    <!-- reference the count by the post.id --> 
    post_count: <%= @comment_counts[post.id] %> 
<% end %> 
0

Tôi chỉ chạy vào thử thách này và giải quyết nó theo cách này:

def trainee_counts 
    @trainee_counts ||= Hash[Trainee.group(:klass_id).count] 
end 

    # where the count is needed 
    trainee_counts[klass_id].to_i 

Một cuộc gọi đến cơ sở dữ liệu và không tải học viên.

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