2009-08-06 17 views
12

ho tavola bilanci con emptype_id e calendar_id actual_head, estimated_headrotaie a più colonne

quando faccio Budgets.sum(:actual_head ,:group=>"emptype_id,calendar_id") non ottengo il risultato raggruppati per queste due colonne, ma solo dalla emptype_id

tuttavia quando ho controllare il registro la query SQL è giusto

SELECT sum(`budgets`.actual_head) AS sum_actual_head, emptype_id,calendar_id AS emptype_id_calendar_id FROM `budgets` GROUP BY emptype_id,calendar_id 

dispone di 103 righe

volevo scorrere ogni emptype_id e calendar_id per ottenere una somma di actual_head e fare alcuni calcoli su di esso.

risposta

3

Non sono sicuro di questo, provare a comprare :group => [:emptype_id, :calendar_id]

+0

ciao, che non funziona getta l'errore di seguito; hmm non c'è modo di gruppo da due colonne "ActiveRecord :: StatementInvalid: Mysql :: Error: Unknown colonna 'emptype_idcalendar_id' in 'dei campi': somma selezionare (' budget s'.actual_head) AS sum_actual_head, emptype_idcalendar_id AS emptype_idcalendar_id FROM 'budget' GROUP BY emptype_idca lendar_id" – philipth

+2

Questo funziona per me con Rails 3.0.x: 'Evaluation.average (: score,: group => [: person_id,: category])'. –

+0

Si verificherà un errore. Se eseguiamo questo codice, il record attivo analizzerà il nome di questa colonna come singola parola come emptype_idcalendar_id –

10

raggruppamento con più colonne non può essere sostenuto dalle rotaie. Devi usare una ricerca regolare tutto:

budgets = Budgets.find(:all, 
         :select => "emptype_id, calendar_id, sum(budgets.actual_head) AS sum_actual_head", 
         :group => "emptype_id, calendar_id") 

budgets.each { |budget| puts budget.sum_actual_head } 
+1

Per le versioni più recenti di rail (> = 3.2) usa 'Budgets.select (" emptype_id, calendar_id, sum (budgets.actual_head) AS sum_actual_head ") .group ("emptype_id, calendar_id") 'poiché find funziona solo con id. – amoebe

5

I cheat. Do :group => ["emptype_id,calendar_id"].

Non voglio né tu né io voglio, ma questo funziona almeno.