Сумма объекта и вычисления - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть статистическая модель:

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 для каждой информации, что если я получу много данных, чтобызанять время, есть ли способ минимизировать это?Что мне нужно, так это первый топ 10.

1 Ответ

0 голосов
/ 11 сентября 2018

Я предполагаю, что каждая статистика имеет уникальную пару 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...