如何在 Arel 中检索按计数排序的一组记录?我有一个模型可以跟踪产品获得的浏览量。我想找到过去 Y 天内查看次数最多的 X 个产品。
这个问题在从 MySQL 迁移到 PostgreSQL 时出现了,因为 MySQL 对它所接受的内容有点宽容。此代码来自 View 模型,适用于 MySQL,但不适用于 PostgreSQL,因为输出中包含非聚合列。
scope :popular, lambda { |time_ago, freq|
where("created_on > ?", time_ago).group('product_id').
order('count(*) desc').limit(freq).includes(:product)
}
这是我到目前为止所得到的:
View.select("id, count(id) as freq").where('created_on > ?', 5.days.ago).
order('freq').group('id').limit(5)
但是,这会返回模型的单个 ID,而不是实际模型。
更新 我去了:
select("product_id, count(id) as freq").
where('created_on > ?', time_ago).
order('freq desc').
group('product_id').
limit(freq)
经过反射(reflection),当结果由 GROUP BY 和聚合函数结果组成时,期望一个完整的模型并不合逻辑,因为返回的数据(很可能)不匹配任何实际模型(行)。
最佳答案
您必须使用您希望检索的所有列扩展您的 select
子句。或
select("views.*, count(id) as freq")
关于ruby-on-rails - 使用 Arel 按频率排序记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7578345/