我正在使用玩家统计数据,我得到了这些数据。
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的平均点数,然后按点来订购。获得最佳射手。
编辑我用以下方法解决了这个问题:
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
谢谢!
您可以使用简单的查询来执行此操作:
hash = Stat.group("user_id").average('pts')
它将返回一个包含user_id作为键的哈希,并将它们的平均点作为值。
现在订购你可以订购这个哈希:Hash[h.sort_by{|k, v| v.to_i}.reverse]
这将返回按点降序排序的哈希。这意味着哈希中的第一个元素将是最佳得分者。
注意:v.to_i
用于处理无案件。
试试这个...
Stat.group(:user_id).order('average_pts DESC').average(:pts)
其他选择。
在控制器中:
@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 %>