支付算法Ruby

时间:2014-05-13 17:23:17

标签: ruby-on-rails ruby

我正在构建一个拥有用户和分数的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] }

但我不确定如果他们是最后一个位置的并列,如何执行决胜局。

1 个答案:

答案 0 :(得分:1)

要获得用户数量,您应该使用count而非size - size获取所有行,然后对其进行计数,而count计算行数在DB中,并返回数字:

user_count = ParticipatingUser.where(game_id: game_id).count

<击>

(实际上 - 以上是错误的 - here是一种解释 - 您应该使用size,它在lengthcount之间巧妙地选择 - 谢谢@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