Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在ActiveRecord集合中获得项目的排名,并使用领带?_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 如何在ActiveRecord集合中获得项目的排名,并使用领带?

Ruby on rails 如何在ActiveRecord集合中获得项目的排名,并使用领带?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我收集了@players,按总积分排序。我试图找出一个特定的@player在@players集合中的排名 示例:共有5名玩家,以下是他们的总积分: 球员1:20分 球员2:20分 球员3:15分 球员4:15分 球员5:15分 考虑到我们这样衡量关系: 球员1:1平 球员2:1平 球员3:第三局打成平局 球员4:第三局打成平局 球员5:第三局打成平局 只显示玩家4等级的最简单方法是什么?这是否可以在不遍历整个集合的情况下实现?我知道如何通过检查前一个迭代器的总积分是否相同来打印整个列表,但我不需

我收集了@players,按总积分排序。我试图找出一个特定的@player在@players集合中的排名

示例:共有5名玩家,以下是他们的总积分:

球员1:20分 球员2:20分 球员3:15分 球员4:15分 球员5:15分 考虑到我们这样衡量关系:

球员1:1平 球员2:1平 球员3:第三局打成平局 球员4:第三局打成平局 球员5:第三局打成平局 只显示玩家4等级的最简单方法是什么?这是否可以在不遍历整个集合的情况下实现?我知道如何通过检查前一个迭代器的总积分是否相同来打印整个列表,但我不需要显示整个列表,只需要显示当前玩家的排名

在我的应用程序中,将有近千名玩家,因此我正在尝试找到一种快速计算的方法

编辑:

以下是我根据@max的回答得出的结论:

 @grouped_players = Player.all.reorder(total_points: :desc).group(:total_points).count
 our_rank = 0
 tied = false
 @grouped_players.each do |points, count|
   if points > @player.total_points
     our_rank += count
   end
   if points == @player.total_points
     our_rank += 1
     if count > 1
       tied = true
     end
     break
   end
 end

 puts our_rank
 puts tied
有人有更优雅的解决方案吗?

您可以使用下面的活动记录组方法来实现。 让你有一个球员模型和列点,将用于衡量排名。因此,查询如下

Player.wherepoint:Player.group:point.sort[3]


您可以看到该组返回数组。我们正在排序,以确保第4位将在索引3上。现在使用第四个位置点搜索所有用户。请记住,如果数据上没有第四个位置,那么它将搜索具有空值的用户。因此,请确保每个用户至少有0点。希望它能帮助你

你基本上是想找出有多少玩家的分数高于当前玩家的分数,然后加1。如果total_points是一个数据库属性,那么您应该能够调用Player.group:total_points.count,在您的示例中,它应该返回{20=>2,15=>3}。然后从散列中选择哪些元素的键大于当前玩家的分数,求和值,然后加1。如果您愿意,您可以在数据库中而不是在Ruby中执行该过程的某些部分;如果你有很多不同的分数,因此返回的哈希值相当大,那么这可能会更有效。但对于1000名玩家,我不认为这是一个大问题,除非你非常频繁地进行计算

你能告诉我们分数与类中玩家的关系吗?@tibsar total_points只是我提到的玩家类的一个属性,然后你从散列中选择哪些元素的键大于当前玩家的分数,求和,然后加1。在此处添加斜体,指出可以使用哪些方法简化阅读。要确定是否存在平局,只需检查@grouped_players[@player.total_points]是否大于1。迭代时不需要这样做。谢谢,但我不知道用户处于什么位置。我正试图找出他们的立场,用上面提到的平局逻辑。