积分榜/游戏数排行榜

时间:2018-09-12 16:02:39

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

我有统计模型:

Stat(id: integer, points: float, user_id: integer, match_id: integer, team_id: integer)

对于匹配模型:

 Match(id: integer, team_a_id: integer, team_b_id: integer)

状态可以与相同的user_idmatch_id复制。我需要的是为每个SUM获得user_id分,然后将其除以match_id的数量,即玩过的游戏。

示例:

{id: 1, points: 2, user_id: 1, match_id: 1, team_id: 1}
{id: 2, points: 3, user_id: 1, match_id: 1, team_id: 1}
{id: 3, points: 4, user_id: 1, match_id: 2, team_id: 1}

所以在这里我有2场比赛。我需要得到user_id的总和,然后将其除以他的游戏数(即2(match_id 1和2))。然后获取前10个最高的指针。

3 个答案:

答案 0 :(得分:1)

我认为您可以进一步优化查询,但这应该可以按user_id将User和Stat ang分组加入。

在控制器中:

@users = User.joins(:match_stats)
             .group('users.id')
             .select("users.name AS name, SUM(match_stats.points) as tot_points, COUNT(DISTINCT match_stats.match_id) AS tot_matches, (SUM(match_stats.points)/COUNT(DISTINCT match_stats.match_id)) AS average_points_per_match")
             .order("average_points_per_match DESC")
             .limit(10)

并且在视图中(非常基本):

<% @users.each do |user| %>
  <p><%= user.name %> | <%= user.tot_points %> | <%= user.tot_matches %> | <%= user.average_points_per_match %></p>
<% end %>

答案 1 :(得分:0)

要从其所有统计信息中获取用户积分的总和:

user_sum_points = user.stats.map(&:points).compact.sum

我不太清楚您要输入的第二个数字。您是否打算除以用户参加比赛的总数?如果是这样,那么您可以计算其匹配项的唯一ID:

user_num_matches = user.stats.map(&:match_id).uniq.length

最后,进行除法:

(user_sum_points / user_num_matches) unless user_num_matches == 0

答案 2 :(得分:0)

我的旧代码:

stat= section
    .group(:user_id)
    .select("user_id, count(*) as matches_count, sum(points) as score")
    .where.not(match_id: nil)

转到此:

stat= section
    .group(:user_id)
    .select("user_id, COUNT(DISTINCT match_id) as matches_count, sum(points) as score")
    .where.not(match_id: nil)

使用COUNT(DISTINCT match_id)而不是COUNT(*)修复了此问题。谢谢!归功于:@Ovidiu Toma