按加权变量排序结果?

时间:2013-05-15 21:16:15

标签: sql ruby-on-rails sorting rails-activerecord

我有大约10,000个应用程序的列表,我想通过某些列来订购它们,但我想让某些列比其他列更“重量”。

例如,每个应用都有overall_ratingscurrent_ratings。如果该应用有很多overall_ratings,那么价值为1.5,但current_ratings的数量值,比如说2,因为current_ratings的数量显示该应用处于有效状态且目前很受欢迎

现在我想要考虑这些变量中的4-6个。

那么,我该如何解决这个问题呢?在查询本身?在使用Ruby之后(请记住,这里需要处理超过10,000行)?还有别的吗?

这是一个Rails 3.2应用程序。

2 个答案:

答案 0 :(得分:1)

在普通Ruby中对10000个对象进行排序似乎不是一个好主意,特别是如果你只想要前10个左右。

您可以尝试将数学公式放入查询中(使用Active Record中的订购方法)。

但是,我最喜欢的方法是创建一个float属性来存储得分并使用before_save方法更新该值。

我会读到有关脏属性的内容,因此您只有在更新某些条件时才会执行此评分。

您还可以创建一个rake任务,对当前对象进行重新分数。

通过这种方式,您可以在Ruby中保留评分功能(可以轻松测试),并且可以为float属性添加索引,以便数据库查询具有更好的性能。

答案 1 :(得分:0)

一次尝试是让数据库通过以下查询为您完成此工作:(由于使用了数据库模式,无法真正测试它):

ActiveRecord::Base.connection.execute("SELECT *, 
                                         (2*(SELECT COUNT(*) FROM overall_ratings
                                         WHERE app_id = a.id) + 
                                          1.5*(SELECT COUNT(*) FROM current_ratings
                                         WHERE app_id = a.id) 
                                       AS rating FROM apps a 
                                       WHERE true HAVING rating > 3 ORDER BY rating desc")

想法是将每个当前和总体评级的评级数与特定应用ID的子查询相加,并根据需要对其进行加权。