Создание таблицы лидеров - PullRequest
0 голосов
/ 25 августа 2018

Я работаю со статистикой игроков и получил эти данные.

Stat model = id: integer, pts: float, user_id: integer, created_at: datetime, updated_at: datetime

Так что есть вероятность, что user_id имеет 2 или более данных.

{id: 1, pts: 2, user_id: 1, created_at: datetime, updated_at: datetime}

{id: 2, pts: 8, user_id: 1, created_at: datetime, updated_at: datetime}

{id: 3, pts: 10, user_id: 2, created_at: datetime, updated_at: datetime}

Мне нужно получить среднее количество очков на user_id, а затем упорядочить по пунктам.Чтобы получить лучший результат.

РЕДАКТИРОВАТЬ Я исправил это с помощью:

stat = Stat.group(:user_id).sum("pts")
new_value = Hash[*stat.sort_by { |k,v| -v }[0..9].flatten] # To get top 1 to 10

Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Попробуйте это ...

Stat.group(:user_id).order('average_pts DESC').average(:pts)
0 голосов
/ 25 августа 2018

Другой вариант.

В контроллере:

@users = User.joins(:stats).select("users.*, stats.user_id, stats.pts, AVG(stats.pts) avg_pts").group('stats.user_id').order("avg_pts DESC")

В формате, который вам нужно отформатировать:

<% @users.each do |user| %>
  <p><%= user.name %> | <%= user.avg_pts %></p>
<% end %>
0 голосов
/ 25 августа 2018

Вы можете сделать это с помощью простого запроса:

hash = Stat.group("user_id").average('pts')

Он вернет хеш, содержащий user_id в качестве ключа и их средние баллы, оцененные как значение.

Теперь на заказ вы можете заказатьэтот хэш выглядит следующим образом: Hash[h.sort_by{|k, v| v.to_i}.reverse]

Возвращает хэш, отсортированный по убыванию по точкам. Это означает, что первым элементом в хэше будет самый высокий балл.

Примечание: v.to_iиспользуется для обработки нулевых случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...