Sql 在筛选排名表后,了解ActiveRecord(RoR)查询的位置
我将Rails与ActiveRecord一起使用 我正在做一个游戏,玩后你可以提交总分到你的数据库。 当您需要创建排名页面时,问题就出现了。排名页面应该显示的是得分最高的20名最佳用户,按降序排列。在获得所有数据(并在从数据库获得数据后进行必要的处理)之后,我只需通过AJAX发送数据。我正在使用AngularJS发出HTTP Ajax请求。虽然这是另一个故事 我将以JSON格式发送信息,它是一个数组,每个索引都有一个散列。还有一些事情我不知道如何干净利落。我必须:Sql 在筛选排名表后,了解ActiveRecord(RoR)查询的位置,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我将Rails与ActiveRecord一起使用 我正在做一个游戏,玩后你可以提交总分到你的数据库。 当您需要创建排名页面时,问题就出现了。排名页面应该显示的是得分最高的20名最佳用户,按降序排列。在获得所有数据(并在从数据库获得数据后进行必要的处理)之后,我只需通过AJAX发送数据。我正在使用AngularJS发出HTTP Ajax请求。虽然这是另一个故事 我将以JSON格式发送信息,它是一个数组,每个索引都有一个散列。还有一些事情我不知道如何干净利落。我必须: 知道当前登录的用户是否在20个
- id:整数
- id\u用户:整数
- 分数:整数
问题1的解决方案
- 首先我得到了20张最好的记录。我迭代每个记录,比较每个记录的ID是否与当前登录的用户ID相同。如果满足此条件,则我们知道它是20个最佳用户之一。如果用户不在那里,我会查找他的最高分数记录,并将其推送到我将发送给用户的JSON数组
- 我必须用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任务,以便在以后向用户提供当前的最佳_分数。谢谢你的时间!