0

我有大约 10,000 个应用程序的列表,我想按某些列对它们进行排序,但我想给某些列比其他列更“权重”。

例如,每个应用程序都有overall_ratingscurrent_ratings。如果应用程序有很多overall_ratings,则价值 1.5,但数量current_ratings将值得,例如 2,因为current_ratings该应用程序处于活动状态且当前流行的节目数量。

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

那么,我怎样才能做到这一点呢?在查询本身?事后只使用 Ruby(请记住,这里需要处理超过 10,000 行)?还有什么?

这是一个 Rails 3.2 应用程序。

4

2 回答 2

1

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

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

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

我会阅读有关脏属性的信息,因此您仅在某些标准更新时才执行此评分。

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

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

于 2013-05-15T23:14:19.623 回答
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 的子查询相加,并根据需要对它们进行加权。

于 2013-05-15T23:57:42.943 回答