我有大约10,000个应用程序的列表,我想通过某些列来订购它们,但我想让某些列比其他列更“重量”。
例如,每个应用都有overall_ratings
和current_ratings
。如果该应用有很多overall_ratings
,那么价值为1.5,但current_ratings
的数量值,比如说2,因为current_ratings
的数量显示该应用处于有效状态且目前很受欢迎
现在我想要考虑这些变量中的4-6个。
那么,我该如何解决这个问题呢?在查询本身?在使用Ruby之后(请记住,这里需要处理超过10,000行)?还有别的吗?
这是一个Rails 3.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的子查询相加,并根据需要对其进行加权。