我正在处理玩家统计信息,并且得到了这些数据。
Stat model = id: integer, pts: float, user_id: integer, created_at: datetime, updated_at: datetime
因此user_id
有2个或更多数据的可能性。
{id: 1, pts: 2, user_id: 1, created_at: datetime, updated_at: datetime}
{id: 2, pts: 8, user_id: 1, created_at: datetime, updated_at: datetime}
{id: 3, pts: 10, user_id: 2, created_at: datetime, updated_at: datetime}
我需要获取每个user_id的平均pt,然后按pts排序。要获得最佳射手。
编辑 我已经使用以下方式修复了该问题:
stat = Stat.group(:user_id).sum("pts")
new_value = Hash[*stat.sort_by { |k,v| -v }[0..9].flatten] # To get top 1 to 10
谢谢!
答案 0 :(得分:0)
您可以通过简单的查询来做到这一点:
hash = Stat.group("user_id").average('pts')
它将返回一个包含user_id作为键的哈希值,并将其平均得分作为值。
现在可以订购此哈希,如下所示:
Hash[h.sort_by{|k, v| v.to_i}.reverse]
这将返回按点数降序排列的哈希,这意味着哈希中的第一个元素将是最高得分手。
注意:v.to_i
用于处理零个情况。
答案 1 :(得分:0)
尝试一下...
Stat.group(:user_id).order('average_pts DESC').average(:pts)
答案 2 :(得分:0)
其他选项。
在控制器中:
@users = User.joins(:stats).select("users.*, stats.user_id, stats.pts, AVG(stats.pts) avg_pts").group('stats.user_id').order("avg_pts DESC")
在视图中,根据需要进行格式化:
<% @users.each do |user| %>
<p><%= user.name %> | <%= user.avg_pts %></p>
<% end %>