2012-01-30 15 views
13

Mam następujący model:szyny 3 i GROUP BY sum

activity_types: id, name 

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

sklepu działania stołowego, ile razy występuje działalność po dniu. Ale teraz chcę pokazać użytkownikowi, ile działań z każdego typu miało miejsce w danym miesiącu.

mam następujące rozwiązanie based on this post który wydaje się 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") 

ale to wydaje się dużo kodu do standardów szyn i rails API says it's deprecated.

Znalazłem następujące rozwiązanie, które jest dużo prosty:

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

Które zwraca hash z activity_type_id => wystąpień.

Co należy zrobić, aby uzyskać następującą wartość skrótu: activity_type.name => wystąpienia?

+0

'activity_types: id, name' tutaj activity_type nazwa będzie Uniq? grupowanie i porządkowanie na activity_types.id jest po prostu spowodowane tym, że chciałeś zamówić hash na podstawie activity_types.id, prawda? –

Odpowiedz

15

Jeśli oryginalna kwerenda pracował, a potem po prostu spróbować przepisanie go Rails 3 składnią:

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

Cóż, jeśli nie znajdę żadnego czystszego rozwiązania (1 lub 2 linie kodu), pójdę z tym. Ale po prostu nie mam ochoty szyny. – 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 

w przypadku, gdy potrzebne uporządkowaną hash oparciu o activity_types.id i zakładając activity_types_id nie jest potrzebne jako część klucza hash.

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

okrywać [activity_type_id, activity_types.name] potrzebne jako część kluczowych

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

Mówi, że plik activity.id musi pojawiać się w klauzuli GROUP BY lub być używany w funkcji agregującej. Udało mi się to naprawić, dodając klauzulę select, ale twoja odpowiedź jest podobna do @maprihora odpowiedź – dcarneiro

+0

masz na myśli powiedzieć active_types_id i activity.id napisany w powyższym komentarzu jest błąd literowy? –

+0

zaktualizowana dla kompozytu ma klucz –