ruby-on-rails - 使用 Arel 按频率排序记录

标签 ruby-on-rails postgresql activerecord group-by 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)

经过反射(reflection),当结果由 GROUP BY 和聚合函数结果组成时,期望一个完整的模型并不合逻辑,因为返回的数据(很可能)不匹配任何实际模型(行)。

最佳答案

您必须使用您希望检索的所有列扩展您的 select 子句。或

select("views.*, count(id) as freq")

关于ruby-on-rails - 使用 Arel 按频率排序记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7578345/

相关文章:

ruby-on-rails - ruby rails : Fully functional tableless model

ruby-on-rails - 检查类是否有嵌套类?

sql-server - 如何在postgresql中声明局部变量?

Python Psycopg 执行脚本方法

sql - 在 SQL 中使用位串(而不是整数)匹配位掩码

ruby-on-rails - 在 Ruby on Rails 中,如何为 has_many 关系创建作用域?

ruby-on-rails - 重命名模型并更改对模型的所有引用后,对先前名称的引用仍然存在

ruby-on-rails - 重新排列 Formtastic 布局

ruby-on-rails - 延迟作业将每个请求两次插入后端?

ruby-on-rails - 无法将应用程序部署到 heroku