2016-07-27 10 views
0

Dies ist der Fehler, den ich bekommen:Wie bekomme ich Fehler "unerkannt Token:" # "" für eine Suchanfrage in Rails?

SQLite3::SQLException: unrecognized token: "#": SELECT "posts"."id" AS 
t0_r0, "posts"."title" AS t0_r1, "posts"."content" AS t0_r2, 
"posts"."created_at" AS t0_r3, "posts"."updated_at" AS t0_r4, 
"posts"."user_id" AS t0_r5, "posts"."course_id" AS t0_r6, 
"courses"."id" AS t1_r0, "courses"."name" AS t1_r1, 
"courses"."created_at" AS t1_r2, "courses"."updated_at" AS t1_r3, 
"courses"."major_id" AS t1_r4, "courses"."user_id" AS t1_r5 FROM 
"posts" LEFT OUTER JOIN "courses" ON "courses"."id" = 
"posts"."course_id" WHERE (courses.name IN (#{s},#{s})) ORDER BY 
posts.created_at DESC 

Für diese Abfrage:

@posts = Post.includes(:course).where("courses.name IN (#{@user.courses.map(&:name).collect { |s| '#{s}' }.join(',') })").references(:courses).order("posts.created_at DESC") 

Ich verstehe nicht, warum # {s} im Array die Saiten nicht geworden

Antwort

1

Der Grund Ihr Problem besteht darin, dass die String-Interpolation nicht in einfachen Anführungszeichen funktioniert. Sie müssen "#{s}" verwenden.

Als eine erste Verbesserung ist jedoch die bevorzugte Methode zum Konvertieren einer Variablen in eine Zeichenfolge einfach s.to_s aufrufen. Das heißt, name klingt wie es ist bereits eine Zeichenfolge, so dass der gesamte Prozess der Zuordnung wahrscheinlich beseitigt werden kann.

Sie sollten auch keine String-Interpolation verwenden, um eine Abfrage zu erstellen. Verwenden Sie parametrisierte Abfragen, geben Rails das Array von Strings, und lassen Sie es die Arbeit für Sie tun:

@posts = Post.includes(:course).where('courses.name IN (?)', @user.courses.pluck(:name)) 

Man beachte, dass eine einzelne Spalte aus einem Satz von Ergebnissen zu wählen, ist es enorm schneller zu bedienen pluck(:field) als map(&:field). Die Methode map wählt alle Spalten aus, instanziiert ganze ActiveRecord-Modelle für das Ergebnis und verwirft dann diesen Aufwand, wenn Sie die Sammlung auf das einzelne Feld reduzieren. plucknur wählt das erforderliche Feld aus und erstellt keine AR-Objekte für die Ergebnismenge.

0

Ihre Antwort hat mir sehr geholfen, ich ein Problem mit String iterpolation hatte, dass der Code gearbeitet ist

@posts = Post.all.includes(:course).where("courses.name IN (#{@user.courses.map(&:name).collect { |s| "'#{s}'" }.join(',') })").references(:course).order("posts.created_at DESC")