2012-01-30 132 views
13

我有以下型號:軌道3 GROUP BY和總和

activity_types: id, name 

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

活動錶店的活動日益出現的次數。但現在我想向用戶展示每個月每種類型發生的活動數量。

我得到了以下的解決方案based on this post這似乎確定:

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

但這似乎對鋼軌的標準和rails API says it's deprecated大量的代碼。

我發現下面的溶液這是很多簡單:

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

哪個返回與activity_type_id =>出現一個散列。

我該怎麼做才能得到以下散列:activity_type.name =>發生了什麼?

+0

'activity_types的一部分:ID,name'這裏ACTIVITY_TYPE名稱將被uniq的?對activity_types.id進行分組和排序僅僅是因爲你想要基於activity_types.id排序哈希,對吧? – 2012-01-31 20:08:30

回答

15

如果原來的查詢工作,那麼就嘗試用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

好吧,如果我沒有找到更清潔的解決方案(1或2行代碼),我會繼續這樣做。但它只是感覺不像rails – dcarneiro 2012-01-30 19:51:28

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 

的情況下,你需要就activity_types.id基於有序散列並假設activity_types_id不需要作爲散列鍵的一部分。

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

櫃面[activity_type_id,activity_types.name]需要作爲重點

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

它表示activity.id必須出現在GROUP BY子句中或用於聚合函數中。我可以通過添加一個select子句來解決這個問題,但是你的答案類似於@maprihora答案 – dcarneiro 2012-01-31 12:30:26

+0

你的意思是說activity_types_id和activity.id寫在上面的評論是錯字錯誤? – 2012-01-31 20:02:59

+0

已更新爲複合有關鍵 – 2012-01-31 20:33:17