Hi all, I was wondering how one does multiple sum/average/max/min in a
single query using AR.
It would be cool to be able to do:
totals = Call.sum([:price,:duration], { :conditions => "destination
''UK''", :group => "location" })
and end up with a hash with totals[:location][:colname]
e.g.:
totals[''london''][''price''] = 15
totals[''london''][''duration''] = 30
totals[''leeds''][''price''] = 20
totals[''leeds''][''duration''] = 40
totals[''manchester''][''price''] = 10
totals[''manchester''][''duration''] = 20
Ideally I would even dream about something that can do:
totals = Call.calculate([:sum,:sum,:count],[:price,:duration,:call], {
:conditions => "destination = ''UK''", :group =>
"source,location" })
Which would give me a hash with totals[:source][:location][:colname]
e.g.:
totals[''US''][''london''][''price'']
= 15
totals[''US''][''london''][''duration'']
= 30
totals[''US''][''london''][''call'']
= 5
totals[''US''][''leeds''][''price'']
= 20
totals[''US''][''leeds''][''duration'']
= 40
totals[''US''][''leeds''][''call'']
= 8
totals[''FR''][''london''][''price'']
= 10
totals[''FR''][''london''][''duration'']
= 20
totals[''FR''][''london''][''call'']
= 5
Any one has been confronted to this problem? How did you sort this out?
My current way of doing it is:
Call.find(:all, :select => "''price'' =
sum(''price''), ''duration'' sum(duration),
''call'' = count(call), source, location", :conditions
=>
"destination = ''UK''", :group =>
"source,location" )
Then I iterate through the result collection and make up the hash myself
It works fine but I was hoping to find a Rails way of doing so....
Gael