rails 3 group by和sum

我有以下型号:

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

活动表存储每天活动发生的次数。 但是现在我想向用户展示每个类型的活动按月发生了多少。

我根据这篇文章得到了以下解决方案,似乎没问题:

 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标准的代码和rails API说它已被弃用了 。

我发现以下解决方案非常简单:

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

返回带有activity_type_id => occurrence的哈希值。

我该怎么做以获得以下哈希: activity_type.name =>出现?

如果原始查询有效,那么只需尝试使用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") 

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) 

incase [activity_type_id,activity_types.name]作为密钥的一部分

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