2017-02-20 6 views
0

In meiner Rails 5 App erhalte ich diesen Fehler von einer Abfrage, aber ich weiß nicht, wie Sie es beheben.Rails - PG :: SyntaxError: Fehler: Unterabfrage hat zu viele Spalten

PG::SyntaxError: ERROR: subquery has too many columns

Mein Controller:

def index 
    @canvases = current_user.get_voted Canvas 
    @activities = PublicActivity::Activity.order("created_at desc").where(owner_id: current_user.friend_ids, owner_type: "User").or(PublicActivity::Activity.order("created_at desc").where(recipient_id: current_user.id)).or(PublicActivity::Activity.order("created_at desc").where("key = ? AND recipient_id in (?)", "canvas_product.create", @canvases)).paginate page: params[:page], per_page: 30 
end 

Der Fehler irgendwo in dieser Abfrage ist:

(PublicActivity::Activity.order("created_at desc").where("key = ? AND recipient_id in (?)", "canvas_product.create", @canvases)) 
+0

Bei einer Vermutung ... '@ canvases' ist eine Reihe von tatsächlichen Leinwänden, und vielleicht interpretiert Rails diese nicht als IDs richtig ... versuchen, das zu ändern:' where ("key =? UND recipient_id in (?) "," Canvas_product.create ", @ canvases.map (&: id))' - wenn das funktioniert, dann weißt du, dass es das ist. –

+0

Das war es! Danke! Gibt es irgendeine Anpassung? sollte ich tun, um @canvases einzuschränken, um IDs vor der Abfrage zu sein (um effizienter zu sein)? Danke! – yellowreign

+0

Ich werde eine Antwort erstellen und das hinzufügen :) –

Antwort

1

Sieht aus wie @canvases eine Reihe von tatsächlichen Leinwänden ist, und vielleicht Rails ist nicht interpretieren diese als IDs richtig ...

Sie können, dass wie diese nur ids konvertieren:

where("key = ? AND recipient_id in (?)", "canvas_product.create", @canvases.map(&:id)) 

Alternativ Sie pluck über die Assoziation verwenden, können Sie zum Beispiel müssen nur die ids auszureißen:

@canvas_ids = current_user.get_voted(Canvas).pluck(:id) 

(obwohl dies davon abhängt, wie get_voted geschrieben wird)

+1

Besser wäre etwas wie 'where (: recipient_id => @ canvases.select (: id)) 'if' @ canvases' ist eine Relation, die AR dazu bringt, eine Unterabfrage zu verwenden und die Arbeit in der Datenbank zu belassen. –

Verwandte Themen