根据每个用户的个人排名实施全球排名系统。 (Rails项目)

时间:2017-03-30 17:11:27

标签: ruby-on-rails ruby

好的,所以我有大约20支队伍,每个人在他的个人排名列表中排名上下每个队。喜欢以下格式

    -Barcelona "Move up on the list" "Move Down on the list"
    -Arsenal "Move up" "Move Down"
    -Liverpool "Move up" "Move Down"

所以在这个例子中,对于这个特定的用户,巴塞罗那排名第1,阿森纳排名第2等。

现在我想在考虑每个个人排名列表后创建一个全球排名系统。

从逻辑上讲,我如何做到这一点? 较小的等级意味着更高的位置,所以我不能只拿出总和,看看哪个更大。或者我可以拿一笔钱看看哪个更小?

我认为我可以在每个团队中添加一个“全球排名”整数,看看哪个更小,但这种方法是对的吗?

1 个答案:

答案 0 :(得分:1)

您可以使用averages来表示global_rankings,这也可以使global_rankings保持最新变得相对简单。

如果您的global_ranking是该团队的平均排名(给定团队/列表数量的每个列表的排名索引总和),则global_ranking上每个列表更改的值为1 /列表数。

这意味着在列表上移动一个团队需要将其global_ranking减少1/number of lists,而在列表中向下移动的团队需要将其global_ranking增加1/number of lists(假设等级随着列表向下移动,索引会变大。

只要每个新列表初始化为与当前global_ranking具有相同的顺序,这应保持准确。
即便如此,您可能仍希望定期(可能每晚)重新计算平均值/ global_rankings以防万一。
这种方法应该相对较快,因为在数据库中获取列表总数应该相对简单,每次请求只需要完成一次。

可替换地,

您可以定期重新计算每个团队的平均值(想想几分钟甚至每几秒钟)。您可能会更轻松地使用此方法,因为它意味着您不必担心在正常按钮按下之外更改列表。性能方面,它可能在您的服务器/数据库上有点重,但并不一定需要您的最终用户看到。有几种不同的方法可以做到这一点。

我能想到的方法:

  1. DelayedJob(这是在给定时间运行任务的宝石)和/或Clockwork(宝石可让您安排rb任务)(我发现这些都是有用的宝石,尽管你可能不喜欢和除了rails服务器之外,这些宝石确实需要它们自己的流程,所以如果您打算使用它们,请记住这一点。
  2. 在您的数据库上安排一个过程(这在很大程度上取决于您的数据库并且纯粹是SQL)。
  3. 跟踪应用程序上次计算这些值的时间,并在x个时间后使用第一个请求更新它们(这会影响n个请求中的1个请求可能会显着减慢它)。