# Association count sorting

I have 3 models GrandPa, Pa, Kid

GrandPa => has_many :pas
Pa => has_many kids

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

Kid has one pa and has one grandpa through pa
Pa has one to many kids and has one grandpa
Grandpa has one to many kids and has one pa

<%= :name[gp]

?pa = kid if from gp?

I think you should just have one model with a foreign key to parent and
quantity of child including nil.

Thanks.

Grandpa has one to many kids and has one pa
No, Grandpa has_many pas

I didnt quite get how you proposed listing the pas (and kid count for
each pa) that belong to a certain grandpa

On Jul 19, 7:42 pm, Angel Robert M. [email protected]

Here is the answer if someone else runs into 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”).each do |pa|
p “#{pa.name} : #{pa.kid_count}”
end
end

On Jul 19, 7:58 pm, Angel Robert M. [email protected]

On 20 July 2010 03:22, badnaam [email protected] wrote:

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

How do I accomplish #2?

A crude way (untested), I am sure there are better as I suspect this
will call count zillions of times. It should get you going and you
can refactor when you want to.
grandpa.pas will give you an array of pas, then simply sort this array
by the number of kids.
sorted = grandpa.pas.sort_by { |p| p.kids.count }

Colin

Thanks.

Grandpa has one to many kids and has one pa
No, Grandpa has_many pas

How is this possible? That’s like saying I have two left arms.

I didnt quite get how you proposed listing the pas (and kid count for
each pa) that belong to a certain grandpa

Because the sort is to easy to explain. What you’re sorting and why is
the
problem. So, now that I have two left arms how do I sort them by thumb
length on my right arm. Well, I guess get a mirror.

On 20 July 2010 04:14, badnaam [email protected] wrote:

Here is AN answer if someone else runs into this…

Your solution may certainly work… but is a bit “imperative” in
coding terms, and does introduce an n+1 problem.

Rails offers a feature called “counter_cache” on associations - which
gives you a column in associate keeping track of the amount of
“belonging” records.

Have a look for it in the manual here:
http://rails.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

If you use it, you can then just do a normal find without the block
and order by the counter-cache column, which avoids all the extra SQL
counts.