Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.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
Sql 在筛选排名表后,了解ActiveRecord(RoR)查询的位置_Sql_Ruby On Rails_Activerecord - Fatal编程技术网

Sql 在筛选排名表后,了解ActiveRecord(RoR)查询的位置

Sql 在筛选排名表后,了解ActiveRecord(RoR)查询的位置,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我将Rails与ActiveRecord一起使用 我正在做一个游戏,玩后你可以提交总分到你的数据库。 当您需要创建排名页面时,问题就出现了。排名页面应该显示的是得分最高的20名最佳用户,按降序排列。在获得所有数据(并在从数据库获得数据后进行必要的处理)之后,我只需通过AJAX发送数据。我正在使用AngularJS发出HTTP Ajax请求。虽然这是另一个故事 我将以JSON格式发送信息,它是一个数组,每个索引都有一个散列。还有一些事情我不知道如何干净利落。我必须: 知道当前登录的用户是否在20个

我将Rails与ActiveRecord一起使用

我正在做一个游戏,玩后你可以提交总分到你的数据库。 当您需要创建排名页面时,问题就出现了。排名页面应该显示的是得分最高的20名最佳用户,按降序排列。在获得所有数据(并在从数据库获得数据后进行必要的处理)之后,我只需通过AJAX发送数据。我正在使用AngularJS发出HTTP Ajax请求。虽然这是另一个故事

我将以JSON格式发送信息,它是一个数组,每个索引都有一个散列。还有一些事情我不知道如何干净利落。我必须:

  • 知道当前登录的用户是否在20个最佳用户中,并用颜色或其他标记,这样当它到达客户端时,客户端可以给它上色
  • 如果该用户不在20名最佳用户之列,则搜索该用户并获得排名。简而言之:我不知道如何获得特定用户的排名
  • 我有下一个型号:

    游戏会话(型号):

    • id:整数
    • id\u用户:整数
    • 分数:整数

    问题1的解决方案

    • 首先我得到了20张最好的记录。我迭代每个记录,比较每个记录的ID是否与当前登录的用户ID相同。如果满足此条件,则我们知道它是20个最佳用户之一。如果用户不在那里,我会查找他的最高分数记录,并将其推送到我将发送给用户的JSON数组
    问题2的解决方案:

    • 我必须用WHERE by user_Id查询用户。我要做的是获得用户玩游戏的所有时间的最高分数(我注册用户玩的所有游戏)。之后,我可能会在“user_id”上应用DISTINCT,按score DESC排序,并在执行查询后获得结果表的行索引。我不知道是否有办法知道查询后得到的表行的索引
    我不知道是我把事情复杂化太多了,还是我没有使用好的方法


    提前感谢。

    这里有一个提示:计算最佳分数大于当前用户最佳分数的用户数。在该计数上加1,即可得到当前用户的排名

    为了效率,考虑使用用户记录存储每个用户的最佳分数,并且每当用户完成游戏会话时更新它。在

    users
    表上的
    best_score
    列中添加索引,以便快速计数

    要生成leader board,只需按用户的最佳得分对其进行排序,并将其限制在前20名

    一些代码:

     class User
       def rank
         User.where("best_score > ?", best_score).count + 1
       end
    
       def self.leaders
         order("best_score desc, id asc").limit(20)
       end
     end
    
    然后你可以写:

     current_user.rank  # returns ranking of user as an integer
     User.leaders       # returns a list of 20 top scorers, highest scorer first
    
    要知道当前用户是否在前20名中,您只需查看

    if current_user.rank <= 20
    

    if current_user.rank假设问题:如果多个用户的分数相同,您将如何确定排名?好问题。我真的不在乎在这种情况下哪一个是第一个,但我们可以决定谁的提交日期最早。不过,如果这让事情复杂化,我也不会太在意。我正在寻找最简单的解决方案(这并不意味着它将是一个复杂或直接的答案)。尽管如此,我还是愿意去解决它,或者去改进一些我没有像你那样考虑的设计问题。非常感谢!这非常有效,你的建议对我很有帮助。此外,它是一个简洁且易于实现的解决方案。自从我开始使用RubyonRails已经一个月了,任何输入都对我有帮助。你最后添加到结尾的细节很有见地。如果你没有告诉我最后一段的话,我可能会更新所有的表,然后放一些类似于0的东西。尽管如此,我仍然可以设置一个rake任务,以便在以后向用户提供当前的最佳_分数。谢谢你的时间!