对象与计算之和

时间:2018-09-11 08:42:46

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

我有统计模型:

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

现在这是我的代码:

stat = Stat.where.not(points: 0).group(:user_id).sum("points")

我需要的是获取每个球员的得分总和,然后得出他们拥有多少场比赛(得分总和/比赛计数)。使用上面的代码,我只能获得每个玩家的总和。

编辑

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)

编辑

这是我的代码:

stat.each do |f|
  new_value = (f.sum_points.to_f / f.matches_count.to_f)
  f.sum_points = new_value.round(2)
  a << f
end

new_stat = a.sort_by(&:sum_points).reverse.first(10).flatten

我必须更改每个数据上的sum_points的值,如果我有很多数据该怎么办,这将花费时间来最小化它吗?我需要的是前十名。

1 个答案:

答案 0 :(得分:3)

我假设每个统计信息都有唯一的user_idmatch_id对,那么以下请求将解决问题:

Stat
  .group(:user_id)
  .select("user_id, count(*) as matches_count, sum(points) as sum_points")

结果,您将收到以下对象的集合:

#<ActiveRecord::Relation [#<Stat id: nil, user_id: 1>, #<Stat id: nil, user_id: 2>]>

每个对象都有sum_pointsmatches_count方法可用:

stats = Stat
  .group(:user_id)
  .select("user_id, count(*) as matches_count, sum(points) as sum_points")

stats.first.user_id # => returns user_id
stats.first.matches_count # => returns the number of matches played
stats.first.sum_points # => returns the number of points earned