如何检索Arel中按计数排序的一组记录?我有一个模型可以跟踪一个产品获得多少视图。我想在过去的Y天里找到X最常浏览的产品。
从MySQL迁移到PostgreSQL时出现了这个问题,因为MySQL在接受什么方面有点宽容。从视图模型来看,这段代码适用于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和aggregate函数结果组成时,期望一个完整的模型是不符合逻辑的,因为返回的数据(很可能)与实际的模型(row)不匹配。
最佳答案
您必须将select
子句扩展为所有要检索的列。或
select("views.*, count(id) as freq")
关于ruby-on-rails - 使用Arel按频率订购记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7578345/