使用 Arel 按频率排序记录
问题:使用 Arel 按频率排序记录 如何检索一组记录,按 Arel 中的计数排序?我有一个模型可以跟踪产品获得的浏览量。我想找到过去 Y 天内浏览次数最多的 X 个产品。 这个问题在从 MySQL 迁移到 PostgreSQL 时出现了,因为 MySQL 在接受什么方面有点宽容。此代码来自 View 模型,适用于 MySQL,但不适用于 PostgreSQL,因为输出中包含非聚合列。 scope
·
问题:使用 Arel 按频率排序记录
如何检索一组记录,按 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)
仔细想想,当结果由 GROUP BY 和聚合函数结果组成时,期望一个完整的模型是不合逻辑的,因为返回的数据(很可能)与实际模型(行)不匹配。
解答
您必须使用您希望检索的所有列扩展您的select
子句。或者
select("views.*, count(id) as freq")
更多推荐
已为社区贡献19912条内容
所有评论(0)