I'm developing a system similar to the ForumExample (http://
wiki.rubyonrails.org/rails/pages/ForumExample), and stumbled upon the
following.
Let's say I wanted to get all the categories a certain user posted in.
How do I get that information withouth using a custom query
through :finder_sql (and thus losing the find_in_collection ownage)?
It would also be great to see how many post that author made in a
category while I'm at it.
#view
<% @categories.each do |c|
posts = 0
topics = 0
topics = c.forums.inject do |tsum,topic|
tsum += 1
#count and sum up all topics user has created.
posts += topic.inject do { |psum,post| psum += 1 }
#count and sum up all posts of the user in each topic
end
end %>
<%= "#{@user.id} has started #{topics} Topics and #{posts} in
Category #{c.name}" %><br />
<% end %>
not sure if i use inject correctly here, just googled this thing
Hope oyu get the idea.
and you should put thta stuff in a helper i guess, to make it less
clumpsy.
Eager loading would be the answer:
Category.find(:all, :include=>[{:forums=>{:messages=>:author}}], :conditions=>['authors.name= ?',
'Robert'])
I'm not sure this needs corrections or not but the trick is that curly
braces in :include gives you nested joins.
The find() works (although I must rather would like to have a thing
like this in the model).
Counting the posts is still a problem. An each() loop isn't that
scalable. Any thoughts on doing a SUM in the SQL query somewhere or
something? I've tried out a couple of things with :select, but it was
just ignored...