views:

5167

answers:

3

I have a database with the following schema: t.string "mail" t.integer "country" t.boolean "validated" t.datetime "created_at" t.datetime "updated_at"

And I want to find the top 5 countries in the database, so i go ahead and type

@top5 = Mail.find(:all,:group => 'country',:conditions => [ "validated = ?" , "t" ], :limit => 5 ) This will tell me the groups(i need an order by i dont know how to write)

@top5 = Mail.count(:all,:group => 'country',:conditions => [ "validated = ?" , "t" ], :limit => 5 ) This will tell me how many mails are in each group

Im wondering if i can group and count in just one go

+5  A: 
Mail.find(
   :all, 
   :select => 'count(*) count, country', 
   :group => 'country', 
   :conditions => ['validated = ?', 't' ], 
   :limit => 5)

This should give you records that have a country attribute and a count attribute.

toby
+2  A: 

Try:

Mail.count(:group => 'country', :conditions => ['validated = ?', 't'])

I'm not sure count accepts :limit though.

EDIT:

I think this is more readable:

Mail.count(:group => :country, :conditions => {:validated => true})

Can Berk Güder