问题:使用 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")
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐