= ? AND created_at = '2016-05-31 22:00:00.000000' AND created_at -6ren">
gpt4 book ai didi

sql - ActiveRecord 查询在 DISTINCT 之后强制执行 ORDER BY

转载 作者:行者123 更新时间:2023-11-29 12:57:55 27 4
gpt4 key购买 nike

我正在使用这个查询:

Post.where("created_at >= ? AND created_at <= ?", 1.month.ago.beginning_of_month , 1.month.ago.end_of_month)
.select('DISTINCT user_id')

返回 40 个元素。但是,我希望从此查询中获取一个数组,并能够使用 .each 遍历此数组。问题是,当我尝试对查询结果使用 .each 时,我得到了这个:

ActiveRecord::StatementInvalid: PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list LINE 1: ...ted_at <= '2016-06-30 21:59:59.999999') ORDER BY created_at... ^ : SELECT DISTINCT user_id FROM "posts" WHERE (created_at >= '2016-05-31 22:00:00.000000' AND created_at <= '2016-06-30 21:59:59.999999') ORDER BY created_at DESC

似乎此查询在 created_at 上强制执行 ORDER BY,并由于 order_by 不在查询中而使其中断。

为了避免这个问题,我使用:

Post.where("created_at >= ? AND created_at <= ?", 1.month.ago.beginning_of_month , 1.month.ago.end_of_month)
.map{|p| p.user_id}.uniq

效率较低。

知道为什么我会收到此错误吗?

最佳答案

尝试以下操作:

Post.where(created_at: (1.month.ago.beginning_of_month)..1.month.ago.end_of_month)
.distinct.reorder(nil).pluck(:user_id)

如评论中所述,这是由于 default_scope 造成的:

default_scope {order('created_at DESC')}

关于sql - ActiveRecord 查询在 DISTINCT 之后强制执行 ORDER BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38305000/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com