我有统计模型:
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
的值,如果我有很多数据该怎么办,这将花费时间来最小化它吗?我需要的是前十名。
答案 0 :(得分:3)
我假设每个统计信息都有唯一的user_id
和match_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_points
和matches_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