2

假设您有一个类型为 Item 的对象,它具有 name、view_count、like_count 和 created_at 时间属性,我想创建这些对象的提要,以便我仍然可以获得最新的对象,但也可以根据视图计数和喜欢计数。

使用按创建时间和排名 = view_count + like_count 排序

a.sort_by{|x| [x.rank, -x.created_at]}

将导致按等级排序,然后按 created_at 排序,这将仅用于对象的关系,所以我希望有人能帮助我找出这样做的方法。

先感谢您。

4

1 回答 1

1

首先:如果您有很多对象/记录,您可能希望在数据库中进行排序,以便您可以正确地将它们过滤掉。在大多数情况下,这将有几个优点:

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 中高效地实现一些东西(正确的数据库查询、索引等)

于 2012-08-11T19:19:10.427 回答