gpt4 book ai didi

mysql - 使用 .order 根据用户在 Rails 4 表中的排名返回一个值

转载 作者:行者123 更新时间:2023-11-29 21:09:43 24 4
gpt4 key购买 nike

我试图返回表中用户的排名,但我被难住了。

首先,我有一个用于捕获游戏中得分的表格,名为 Participation 。对于两个玩家,它将包含 user_id 的结果。 , game_id ,最后是 score ,就像这样:

<Participation id: 168, user_id: 1, game_id: 7, ranking: 0, created_at: "2016-04-07 05:36:48", updated_at: "2016-04-07 05:36:58", finished: true, current_question_index: 3, score: 2>

然后第二个结果可能是:

<Participation id: 169, user_id: 2, game_id: 7, ranking: 0, created_at: "2016-04-07 05:36:48", updated_at: "2016-04-07 05:36:58", finished: true, current_question_index: 3, score: 1>

如果我想显示用户放置位置的排行榜,这很容易,例如:Participation.where(game_id: "7").order(:asc) 。我现在正在成功地做到这一点。

相反,我想返回用户在表中排名的结果(如果按 score 组织) ,反对竞争。对于简单来说,在上面的示例中,我将让用户 1 和用户 2 都玩游戏 7,并且:

  • user_id 1:第一名应返回 1,较高分数为 2 分
  • user_id 2:第二名应返回 2,较低分数 1 分

我怎样才能重写participation我的 Controller 中的语句来检查用户在匹配 game_id 中的排名基于分数,然后根据该排名分配一个整数值?

对于奖励积分,如果我可以让 Controller 返回该值(例如 user_id 1 为 1),您认为使用 update_attributes 是一个坏主意吗?将其添加到 ranking列而不是打破一个新表来存储用户排名?

最佳答案

如果您使用的是 mysql,请尝试在有序查询上使用 ROW_NUMBER 函数来计算排名:

Participation.select("user_id, ROW_NUMBER() AS rank").where(game_id: game_id).order(score: :asc)

生成的 SQL 为:

SELECT user_id, ROW_NUMBER() AS rank FROM "participations" ORDER BY "participations"."score" ASC

我通常使用 Postgres,因此无法直接测试查询,但是它应该可以工作。

如果您需要频繁访问排名列,或者需要访问单个用户/游戏对的排名,我建议您缓存排名列。您还需要设置一个后台作业来定期执行此操作,也许每 15 分钟左右执行一次。然而,上述动态查询的好处是它更有可能是最新的,但需要时间来生成,具体取决于该特定游戏存在多少参与条目。

关于mysql - 使用 .order 根据用户在 Rails 4 表中的排名返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36490213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com