我正在构建一个拥有用户和分数的rails应用。我希望上半部分用户获得报酬。我为每个用户存储了一个单独的决胜局输入,如果它们恰好位于最后一个位置(最后支付的位置)。例如,我需要帮助,如果他们是8个用户并且分数为4和5。然后它叫我的决胜局。
这就是我的尝试:
首先,我在计算用户并确定上半部分球员:
theUsersCount = ParticipatingUser.where(game_id: game_id).size
numofWinners = theUsersCount / 2
然后我将用户及其分数推送到阵列,然后只显示赢得的用户的上半部分。
userscores.push("#{user.username}" => playerScore})
userscores[0..numofWinners].sort_by { |y| y[:score] }
但我不确定如果他们是最后一个位置的并列,如何执行决胜局。
答案 0 :(得分:1)
要获得用户数量,您应该使用 count
而非size
- size
获取所有行,然后对其进行计数,而count
计算行数在DB中,并返回数字:
user_count = ParticipatingUser.where(game_id: game_id).count
击> <击> 撞击>
(实际上 - 以上是错误的 - here是一种解释 - 您应该使用size
,它在length
和count
之间巧妙地选择 - 谢谢@nzifnab)
现在,在user_count/2
地方找到用户的分数
minimal_score = ParticipatingUser.order(:score, :desc).pluck(:score).take(user_count/2).last
并以所有用户获得此分数或更多:
winning_users = ParticipatingUser.where('score >= ?', minimal_score).order(:score, :desc)
现在检查用户是否超出预期:
if winning_users.size > user_count/2
然后打破你的关系:
tie_breaker(winning_users[user_count/2-1..-1])
所有在一起:
user_count = ParticipatingUser.where(game_id: game_id).size
minimal_score = ParticipatingUser.order(:score, :desc).pluck(:score).take(user_count/2).last
winning_users = ParticipatingUser.where('score >= ?', minimal_score).order(:score, :desc)
if winning_users.size > user_count/2
losers = tie_breaker(winning_users[user_count/2-1..-1])
winning_users -= losers
end
winning_users