如何按子项上的多个属性进行分组,然后统计?

时间:2013-06-09 15:25:44

标签: ruby-on-rails

在Rails 3.2应用程序中,我有一个拥有许多奖项的用户模型。

奖项类有:type,:level和:image attributes。

在用户的展示页面上,我想展示他们的奖项,但有一些标准。 User.awards应按类型和级别进行分组,对于每个类型级别的组合,我想显示其图像,以及奖励的计数。

我努力构建查询和视图来实现这一点(并清楚地解释这一点)。

如何对子记录的两个属性进行分组,然后显示这些子项的计数和属性(即图像)?

2 个答案:

答案 0 :(得分:1)

由于活动记录对象,数组和分组数组的复杂组合,我花了一些时间来解决这个问题。

无论如何,这对任何其他人都有用

鉴于用户拥有多个奖项,奖励的属性为:type:level:image

for award in @user.awards.group_by{ |award| [award.type,award.level] }.sort_by{|award| [award[0][0], award[0][1]]}
  puts "#{(award[0][0]).capitalize} - Level #{award[0][1]}"  # e.g. Award_Name - Level 1
  puts award[1].first.image #outputs the value of award.image, i.e. the image url 
  puts award[1].count  #counts the number of grouped awards
end

有点蠢!也许有办法优化这段代码?

答案 1 :(得分:0)

根据您使用的数据库,您必须在类型和级别上使用GROUP BY构建自定义SQL查询:

SELECT * FROM users GROUP BY users.type, users.level

(Postgres对GROUP BY有特殊解释,因此请检查您正在使用的数据库的文档。

要在Rails中编写它,请阅读文档:http://guides.rubyonrails.org/active_record_querying.html#group

对于计数,您必须在第二步中执行此操作(Ruby可以使用ActiveRecord对象Array上的size方法执行此操作,查询将返回给您。