在 Rails 3.2 应用程序中,我有一个拥有许多奖项的用户模型。
Award 类具有 :type、:level 和 :image 属性。
在用户的展示页面上,我想展示他们的奖项,但有一些标准。User.awards 应该按类型和级别分组,对于每个类型级别的组合,我想显示它的图像,以及奖励的计数。
我正在努力构建查询和视图来实现这一点(并清楚地解释这一点)。
如何对子记录的两个属性进行分组,然后同时显示这些子记录的计数和属性(即图像)?
在 Rails 3.2 应用程序中,我有一个拥有许多奖项的用户模型。
Award 类具有 :type、:level 和 :image 属性。
在用户的展示页面上,我想展示他们的奖项,但有一些标准。User.awards 应该按类型和级别分组,对于每个类型级别的组合,我想显示它的图像,以及奖励的计数。
我正在努力构建查询和视图来实现这一点(并清楚地解释这一点)。
如何对子记录的两个属性进行分组,然后同时显示这些子记录的计数和属性(即图像)?
由于活动记录对象、数组和分组数组的复杂组合,我花了一些时间才弄清楚这一点。
无论如何,如果这对其他人有用
给定一个 User 有很多 Awards,Award 有属性: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
有点啰嗦!也许有办法优化这段代码?
根据您使用的数据库,您必须使用GROUP BY
on 类型和级别构建自定义 SQL 查询:
SELECT * FROM users GROUP BY users.type, users.level
(Postgres 有一个特殊的解释,GROUP BY
所以检查你正在使用的数据库的文档)。
要在 Rails 中编写它,请阅读文档: http: //guides.rubyonrails.org/active_record_querying.html#group
对于计数,您必须在第二步中执行此操作(Ruby 可以使用size
查询将返回给您的 ActiveRecord 对象数组上的方法来执行此操作)。