:order by association field

Hi. I’m trying to do something that should be a fairly common pattern,
but I’m currently not sure how.

BACKGROUND:
model Family has_one Father. also, Family has field “country_of_origin”
model Father has a number of fields, such as first_name, age, etc.

It’s easy to sort based on families’ fields:
sorted_families = Family.find(:all, :order => ‘country_of_origin’)

But, how do I sort based on the fields of the child? For example, how
do I sort families based on the first name of the associated “father”
field? I.e.,

sorted_families = Family.find(:all, :order => ‘father.first_name’)

clearly this doesn’t work… but you probably understand what I’m
trying to do. If I can’t do this directly in Rails, what’s the cleanest
direct SQL command that will achieve this? Perhaps subqueries/nested
queries will do the trick.

As a related question, how would I sort based on the count of a child
association? For example, assume an Order has_many LineItems; how do I
sort orders based on the count of the associated number of line items?

Thanks in advance for your help!
Mark

Try

sorted_familes = Family.find(:all, :include => :father, :order =>
‘fathers.first_name’)

sorted_familes = Family.find(:all, :include => :father, :order =>
‘fathers.first_name’)

Thanks! This does indeed work. Now, how would I go about doing the
sorting by the count of the children?

my first guess would be

sorted_familes = Family.find(:all, :include => :child, :order =>
‘COUNT(children.*)’)

if you tail -f the development.log, you’ll notice that the :order value
is
being inserted verbatim. it’s nothing but SQL syntaxt. The :include =>
child is simply creating a LEFT OUTER JOIN for you between the families
and
children tables. This is what the rails developers refer to as eager
loading of associations. You can find more information under
ActiveRecord::Associations::ClassMethods and the ActiveRecord#find
method in
the API http://api.rubyonrails.org/