Ruby on rails 对象与计算之和

Ruby on rails 对象与计算之和,ruby-on-rails,ruby,ruby-on-rails-5,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: floa

我有一个统计模型:

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(id: integer, points: float, user_id: integer, match_id: integer, team_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
stat.each do|f|
新值=(f.sum\u points.to\u f/f.matches\u count.to\u f)
f、 求和点=新值。四舍五入(2)

a我假设,每个stat都有唯一的
user\u id
match\u 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>]>

我假设,每个stat都有唯一的
user\u id
match\u 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>]>

匹配的表/模型是什么样子的?你试过什么?是否经常运行此查询?(在这种情况下,您是否考虑过添加一个
计数器
缓存列?)您是否需要优化在单个查询中获取这两个值,还是需要执行这两个单独的查询?@Tim抱歉,我更新了我的问题。这是我的排行榜,所以我认为这将是经常运行。任何事情都可以,但如果单次查询可以做得更好,但我认为单次查询是不可能的。@你可以试试这个
Stat.select(“user\u id,(sum(points)/count(*)as avg”)
?您将在
avg
attribute中获得输出
匹配的表/模型是什么样子的?你试过什么?是否经常运行此查询?(在这种情况下,您是否考虑过添加一个
计数器
缓存列?)您是否需要优化在单个查询中获取这两个值,还是需要执行这两个单独的查询?@Tim抱歉,我更新了我的问题。这是我的排行榜,所以我认为这将是经常运行。任何事情都可以,但如果单次查询可以做得更好,但我认为单次查询是不可能的。@你可以试试这个
Stat.select(“user\u id,(sum(points)/count(*)as avg”)
?您将在
avg
attributehmm中获得输出,似乎此代码将
matches\u count
=作为匹配总数。我需要的是玩家玩过的比赛数。是的,你是对的。用户id和匹配id对是唯一的。代码应该给出玩家玩过的比赛数,因为查询是按
用户id
分组的。你尝试过并收到错误的结果吗?我的错,我搞错了,我有一个默认属性,带有空的match_id,这样用户可以有默认的0 stat,这就是为什么它现在显示2,我用where.not(match_id:nil)修改了它。非常感谢。嗯,这个代码似乎给出了匹配总数的
matches\u count
=。我需要的是玩家玩过的比赛数。是的,你是对的。用户id和匹配id对是唯一的。代码应该给出玩家玩过的比赛数,因为查询是按
用户id
分组的。你尝试过并收到错误的结果吗?我的错,我搞错了,我有一个默认属性,带有空的match_id,这样用户可以有默认的0 stat,这就是为什么它现在显示2,我用where.not(match_id:nil)修改了它。非常感谢。