0

ich diese Abfrage bin mit:Rails: Active Abfrage zwingt ORDER BY nach DISTINCT

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

die 40 Elemente zurückgibt. Ich erwarte jedoch, ein Array von dieser Abfrage zu erhalten, und in der Lage sein, über dieses Array mit einem .each zu iterieren. Das Problem ist, dass wenn ich versuche, .each auf das Ergebnis der Abfrage zu verwenden, ich diese:

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

Es ist wie diese Abfrage scheint erzwingt eine ORDER BY auf dem created_at und macht es zu brechen, da order_by ist nicht in die Abfrage.

Um dieses Problem zu vermeiden, verwende ich:

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 

, die weniger effizient ist.

Irgendeine Idee, warum ich diesen Fehler bekomme?

Antwort

1

Versuchen Sie Folgendes:

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

Wie in den Kommentaren erwähnt, ist dies aufgrund eines default_scope:

default_scope {order('created_at DESC')} 
+0

gleichen Fehler. SELECT DISTINCT "Beiträge" "user_id" FROM "Beiträge" WHERE (created_at> = '2016-05-31 22: 00: 00.000000' und created_at <= '2016-06-30 21: 59: 59.999999') ORDER BY created_at DESC ActiveRecord :: AnweisungInvalid: PG :: InvalidColumnReference: ERROR : Für SELECT DISTINCT müssen ORDER BY-Ausdrücke in der Auswahllisteangezeigt werden 0 ZEILE 1: ... ted_at <= '2016-06-30 21: 59: 59.999999') ORDER BY Erstellter_Art ... ^ –

+0

Noch ein Fehler: ActiveRecord :: StatementInvalid: PG :: InvalidColumnReference: ERROR: Für SELECT DISTINCT müssen ORDER BY-Ausdrücke in der Auswahlliste angezeigt werden. LINE 1: ... ted_at <= '2016-06-30 21: 59: 59.999999') ORDER BY Erstellter_At ... ^ : SELECT DISTINCT "Posts" . "user_id" FROM "Beiträge" WHERE (created_at> = '2016-05-31 22: 00: 00.000000' UND created_at <= '2016-06-30 21: 59: 59.999999') ORDER BY created_at DESC –

+0

Es funktioniert wenn Ich ändere .pluck (: user_id) zu .pluck (: user_id,: created_at), aber das ist nicht das Ergebnis Ich will bc Ich muss über das Ergebnis iterieren, um nur die user_id zu extrahieren –