【问题标题】:Order results by weighted variables?按加权变量排序结果?
【发布时间】:2013-05-10 14:51:24
【问题描述】:

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

例如,每个应用都有overall_ratingscurrent_ratings。如果应用有很多 overall_ratings,则价值 1.5,但 current_ratings 的数量值得,比如 2,因为 current_ratings 的数量表明该应用处于活动状态且当前很受欢迎。

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

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

这是一个 Rails 3.2 应用程序。

【问题讨论】:

  • SQL 数据库并不是完成这项工作的最佳工具。将 elasticsearch 引入您的堆栈,您就很成功了。

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • +1 用于保持运行分数,但如果需要“在曲线上评分”,则需要更多的努力。
【解决方案2】:

一种尝试是让数据库通过一些查询为您完成这项工作,例如:(由于缺少数据库架构,无法真正测试它):

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 的子查询相加,并根据需要对它们进行加权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多