Работаю с моим списком лидеров.Можно минимизировать нагрузку - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть статистика:

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= Stat
.group(:user_id)
.select("user_id, count(*) as matches_count, sum(points) as score")
.where.not(points: 0)
.where.not(match_id: nil)

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 голосов
/ 12 сентября 2018

Наиболее эффективным способом было бы вычислить данные с использованием sql и получить только верхние 10.

По сути, сейчас вы вручную анализируете весь массив активных записей для вычисления sum_points, а затемсортировка и реверсирование всех данных для получения топ-10. Как вы сказали, производительность пострадает, когда в базе данных будет большой объем данных.

Вот мое решение, которое будет вычислять и извлекатьТОП-10, использующие только SQL-запросы:

stat = Stat.group(:user_id)
.select("user_id, round((sum(points) /count(*)), 2) as sum_points")
.where.not(points: 0).where.not(match_id: nil).order("sum_points DESC").first(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...