Eager loading is nice with the include attribute
Post.find(:all, :include => :author)
I'm wondering if you can also eager load counts, like if I wanted to get the number of comments for each post, without loading all the comments themselves?
Maybe something like
Post.find(:all, :include => [:author, "count(comments)")
I suppose I could use a count_cache column. But doing it all in an include would be really beautiful, if it's possible.
Extra bonus points if someone can show how to not only get the count, but put some conditions too, like count of only posts which have been approved.
they should already be loaded use
post.comments.length
I was having this same problem because I was using .count
Building off of avaynshtok's answer, the following technique should just make 2 database calls.
# ./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 4 version:
@comment_counts = Comment.group(:post_id).count
# Rails 3 version:
# @comment_counts = Comment.count(:group => :post_id)
end
Then in your view
<!-- ./app/views/posts/index.html.erb -->
<% @posts.each do |post| %>
<!-- reference the count by the post.id -->
post_count: <%= @comment_counts[post.id] %>
<% end %>
Try this:
Comment.count(:group => :post)
To filter by conditions:
Comment.count(:group => :post, :conditions => {:approved => true })
These will return hashes with posts as keys and the number of comments as values.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With