如何使用视图和创建日期对像对象进行排名?

时间:2012-08-11 18:44:52

标签: ruby ruby-on-rails-3 ranking

假设你有一个Type Item的对象,它有name,view_count,like_count和created_at时间的属性,我想创建这些对象的feed,这样我仍然可以获得最新的对象,但也根据视图计数和类似计数。

使用按时创建的排序和rank = view_count + like_count,如

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

将导致按等级排序,然后按created_at进行排序,这将仅用于对象的关系,所以我希望有人可以帮我找到一种方法。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

1)您可以限制排序之后获取的项目数量(意味着您不必加载到内存中)

2)如果您正确使用索引,它将非常快

按多行排序很简单,并在此问题的答案中进行了解释:Ruby on Rails: how do I sort with two columns using 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查询和索引更复杂(尽管您可以根据包含数学的多个列(即您的评分系统)索引表;这里是一个示例:{{ 3}};这对你来说似乎有点棘手,因为它最近会不断变化,所以也许它应该只是时间戳本身的函数(随着时间的推移而增加,所以最近的项本身就会有更高的值)) 。

基本上,您的第一步将确切地确定哪种数学模型最适合您的需求。实验一下。在那之后,你只需要在Rails中有效地实现这些东西(正确的数据库查询,索引等)。