ActiveRecord查询在DISTINCT之后强制ORDER BY

时间:2016-07-11 10:46:15

标签: sql ruby-on-rails postgresql activerecord rails-activerecord

我正在使用此查询:

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:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中       第1行:... ted_at&lt; =&#39; 2016-06-30 21:59:59.999999&#39;)ORDER BY created_at ...                                                                    ^       :SELECT DISTINCT user_id FROM&#34; posts&#34; WHERE(created_at&gt; =&#39; 2016-05-31 22:00:00.000000&#39; AND created_at&lt; =&#39; 2016-06-30 21:59:59.999999&#39;)ORDER BY created_at DESC

此查询似乎强制ORDER BY上的created_at,并使其中断,因为查询中的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

效率较低。

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

1 个答案:

答案 0 :(得分:2)

尝试以下方法:

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')}