制作排行榜

问题描述 投票:1回答:3

我正在使用玩家统计数据,我得到了这些数据。

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

谢谢!

ruby-on-rails ruby ruby-on-rails-5
3个回答
0
投票

您可以使用简单的查询来执行此操作:

hash = Stat.group("user_id").average('pts')

它将返回一个包含user_id作为键的哈希,并将它们的平均点作为值。

现在订购你可以订购这个哈希:Hash[h.sort_by{|k, v| v.to_i}.reverse]

这将返回按点降序排序的哈希。这意味着哈希中的第一个元素将是最佳得分者。

注意:v.to_i用于处理无案件。


0
投票

试试这个...

Stat.group(:user_id).order('average_pts DESC').average(:pts)

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 %>
© www.soinside.com 2019 - 2024. All rights reserved.