Я строю контроллер / представление, которое предоставляет широкий выбор рейтингов игроков (например, «Топ 10 лидеров»). Используя эту модель:
class Player < ActiveRecord::Base
attr_accessible :name, :games_played, :games_lost, :games_won, games_exited,
:total_kills, :total_deaths, :total_points, :total_coins
end
В моем контроллере у меня есть несколько очевидных результатов запроса, которые нужно передать в мое представление для заполнения рейтинговых списков игроков:
@top_winners = Player.order("games_won DESC").limit(10)
@top_assassins = Player.order("total_kills DESC").limit(10)
Теперь мне нужно добавить несколько отсортированных рейтингов, которые являются расчетами. Примеры:
@most_greedy would be sorted on: :total_coins / :games_played
@most_lethal would be sorted on: :total_kills / :games_played
@most_vanquished would be sorted on: :total_deaths / (:games_lost + :games_exited)
Мой подход состоит в том, чтобы собрать всех игроков в массив, а затем использовать опцию Ruby array.sort {| a,b | block } → new_array
. В случае @most_greedy
я пробовал это:
rich_players = Player.order("total_coins DESC").limit(30) # only consider top 30 richest
@most_greedy = rich_players.sort {|total_coins, games_played| x / y }.slice(0, 9)
Что генерирует ошибку:
undefined local variable or method `x' for #<PlayersController:0x007fb7dac59d08>
К сожалению, мое скудное понимание AR и навыки Ruby подводят меня. Как я могу заставить этот подход работать? Есть ли другой подход к этому типу проблемы? Я не видел ничего в AR Query Guide, как это.