首先:如果您有很多对象/记录,您可能希望在数据库中进行排序,以便您可以正确地将它们过滤掉。在大多数情况下,这将有几个优点:
1)您可以限制排序后获取的项目数量(这意味着您不必将尽可能多的项目加载到内存中)
2)如果您正确使用索引,它会非常快
按多行排序是直截了当的,并在此问题的答案中进行了解释:Ruby on Rails:如何使用 ActiveRecord 对两列进行排序?
就实际排序而言,如果您想在内存中对数组进行排序,您提供的代码应该可以工作:
a.sort_by{|x| [x.rank, -x.created_at]}
你能解释一下问题是什么吗?这似乎是按排名排序,然后按您指定的时间排序。您希望通过其他方式在哪里排序(例如由排名组成的一些分数以及该项目的新近程度)?
编辑:
好的,所以通过您的评论,您希望获得一个将排名与该项目的新近程度相结合的分数。由于几个原因,这将是一个棘手的主题。首先,你如何对结果进行建模/评分将取决于你,并且你必须相应地调整它(所以它可能是Time.now - item.created_at
乘以排名的一部分,或者其他什么。它基本上是你的东西'将不得不玩)。
再想一想,最好只使用 unix 样式的时间戳,而不是Time.now - item.created_at
,因为除非有人严重破坏了您的安全性,否则数字越高,它就会越新。(尽管存在时代问题)。另外,这可能会使以后的其他事情变得更容易。
例如,也许它会是这样的:
rank*(item.created_at - 1300000000)/60000000
,对于当前时间将导致0.7453 * rank
,并且对于从现在开始的一天制造的项目将导致:(0.7467 * rank
所以有点高)。也许您的解决方案会更复杂。找出适合您情况的方程式真的取决于您。
另一个问题是它可能会使您的 SQL 查询和索引更加复杂(尽管您可以基于包含数学(即您的评分系统)的多个列来索引表;这是一个示例:http://use-the-index -luke.com/sql/where-clause/obfuscation/math;这对你来说可能看起来有点棘手,因为它的最新程度会不断变化,所以它可能只是时间戳本身的一个函数(随着时间的推移而增加,因此最近的项目本质上将具有更高的值))。
基本上,您的第一步将是弄清楚哪种数学模型最适合您的需求。实验一下。之后,您只需要在 Rails 中高效地实现一些东西(正确的数据库查询、索引等)