views:

21

answers:

1

I have 3 models GrandPa, Pa, Kid

GrandPa => has_many :pas
Pa => has_many kids, :polymorphic => true #dont ask why

When I list GrandPa I would like to present the following


1 - GrandPa_Name

2 - List of Pas sorted by the number kids each pa has in descending order


How do I accomplish #2?

Thanks

+1  A: 

Try this:

GrandPa.all do |gpa|
 p gpa.name
 gpa.pas.all(:joins => :kids, :select => "pas.*, count(pas.id) AS kid_count"
       :group => :id, :order => "kid_count DESC") do |pa|
   p "#{pa.name} : #{pa.kid_count}"
 end
end

Use the approach below, if you eager load parents and kids.

GrandPa.all(:include => {:pas => :kids}) do |gpa|
  p gpa.name
  gpa.pas.sort_by{|pa| pa.kids.size}.reverse_each do |pa|
    p "#{pa.name} : #{pa.kids.size}"
    pa.kids do |kid|
      p kid.name
    end
  end
end
KandadaBoggu
Excellent. Works like a charm. Just one small change count(pas.id) in 3rd line. Is this best done with this little sql thrown in or in general do you get better performance with this sql syntax?Thanks!
badnaam
This is efficient solution if you DO NOT eager load the kids for each parent. Otherwise look at the second solution provided.
KandadaBoggu