2012-01-30 29 views
13

Tengo el siguiente modelo:carriles 3 por grupo y suma

activity_types: id, name 

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

El almacén de mesa actividades cuántas veces se produce una actividad por día. Pero ahora quiero mostrarle al usuario cuántas actividades de cada tipo ocurrieron por mes.

que tiene la siguiente solución based on this post que parece bien:

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") 

pero esto parece una gran cantidad de código para los estándares de los carriles y rails API says it's deprecated.

me encontré con la siguiente solución que es mucho más simple:

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

que devuelve un hash con activity_type_id => ocurrencias.

¿Qué debo hacer para obtener el siguiente hash: activity_type.name => ¿ocurrencias?

+0

'activity_types: id, name' aquí activity_type nombre va a ser UniQ? Agrupar y ordenar en activity_types.id es solo porque quería un hash ordenado basado en activity_types.id, ¿no? –

Respuesta

15

Si la consulta original trabajó, a continuación, sólo intente volver a escribir con la sintaxis de Rails 3:

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

Bueno, si no encuentro ninguna solución más limpia (1 o 2 líneas de código), voy a ir con esto. Pero simplemente no se siente como los rieles – 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 

en caso de que necesitaba un hash ordenado basado en activity_types.id y asumiendo activity_types_id no es necesario como parte de la clave hash.

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

en caso [activity_type_id, activity_types.name] necesaria como parte de clave

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

Dice que activity.id debe aparecer en la cláusula GROUP BY o debe usarse en una función agregada. Pude arreglar esto agregando una cláusula de selección, pero luego tu respuesta es similar a @maprihora answer – dcarneiro

+0

quieres decir que activity_types_id y activity.id escrito en el comentario anterior es un error tipográfico? –

+0

actualizado para composite tiene la clave –