2016-07-27 53 views
0

這是錯誤我得到:如何擺脫錯誤「無法識別的令牌:」#「」在軌搜索查詢?

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 

對於此查詢:

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

我不明白爲什麼#{S}不會成爲陣列

回答

1

的原因在字符串因爲你的問題是字符串插值在單引號內不起作用。您需要使用"#{s}"

但是,作爲第一個改進,將變量轉換爲字符串的首選方法僅僅是調用s.to_s。也就是說,name聽起來像是已經是的一個字符串,所以整個映射過程可能會被消除。

您也不應該使用字符串插值來構建查詢。使用參數化查詢,給Rails的字符串數組,並讓它爲你做的工作:

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

需要注意的是,從一組結果中選擇一列,這是極大更快地使用pluck(:field)map(&:field)。方法map選擇所有列,爲結果實例化整個ActiveRecord模型,然後在將集合減少到單個字段時拋出所有這些努力。 pluckonly選擇必填字段,並且不爲結果集構建AR對象。

0

你的答案真的幫助了,我只好用繩子iterpolation一個問題,即工作的代碼是

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