2012-01-30 12 views
13

Ho il seguente modello:rotaie 3 GROUP BY e somma

activity_types: id, name 

activities: id, id_activity_type, occurrences, date (other fields) 

Il negozio tabella attività quante volte si verifica un'attività di giorno. Ma ora voglio mostrare all'utente quante attività di ogni tipo si sono verificate per mese.

ho ricevuto la seguente soluzione based on this post che sembra ok:

Activity.all(:joins => :activity_types, 
      :select => "activity_types.id, activity_types.name, SUM(activities.occurrences) as occurrences", 
      :group => "activity_types.id, activity_types.name", 
      :order => "activity_types.id") 

ma questo sembra un sacco di codice per le norme e le rotaie rails API says it's deprecated.

ho trovato la soluzione a seguito della quale è molto semplice:

Activity.sum(:occurrences).group(:activity_type_id) 

che restituisce un hash con activity_type_id => occorrenze.

Cosa devo fare per ottenere il seguente hash: activity_type.name => occorrenze?

+0

'activity_types: id, name' qui activity_type nome sta per essere UniQ? raggruppare e ordinare su activity_types.id è solo perché volevi un hash ordinato basato su activity_types.id, giusto? –

risposta

15

Se la query originale ha funzionato, poi basta provare a riscrivere con Rails 3 sintassi:

Activity.joins(:activity_types) 
    .select("activity_types.id, activity_types.name, SUM(activities.occurrences) as occurrences") 
    .group("activity_types.id, activity_types.name") 
    .order("activity_types.id") 
+0

Bene, se non trovo alcuna soluzione più pulita (1 o 2 linee di codice), andrò con questo. Ma semplicemente non mi sento come rotaie – dcarneiro

4

Activity.joins(:activity_types).group('activity_types.name').sum(:occurrences)

SELECT SUM(activities.occurrences) AS sum_occurrences, activity_types.name AS activity_types_name FROM activity_types INNER JOIN activity_types ON activity_types.id = activities.activity_types_id GROUP BY activity_types.name 

nel caso in cui si aveva bisogno di un hash ordinata sulla base di activity_types.id e assumendo activity_types_id non è necessario come parte della chiave hash.

Activity.joins(:activity_types).group('activity_types.name').order(:activity_types_id).sum(:occurrences) 

incassa [activity_type_id, activity_types.name] necessario in quanto una parte della chiave

Activity.joins(:activity_types).group(:activity_types_id, 'activity_types.name').order(:activity_types_id).sum(:occurrences) 
+0

Dice che activity.id deve apparire nella clausola GROUP BY o essere usato in una funzione di aggregazione. Sono stato in grado di risolvere questo problema aggiungendo una clausola select, ma la tua risposta è simile alla risposta @maprihora – dcarneiro

+0

intendi dire activity_types_id e activity.id scritto nel commento sopra è errore di battitura? –

+0

aggiornato per composito ha la chiave –