制作排行榜

时间:2018-08-25 09:02:26

标签: ruby-on-rails ruby ruby-on-rails-5

我正在处理玩家统计信息,并且得到了这些数据。

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

谢谢!

3 个答案:

答案 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 %>