【问题标题】:How do I get rid of error "unrecognized token: "#" " for a search query in rails?如何摆脱 Rails 中搜索查询的错误“无法识别的令牌:“#””?
【发布时间】:2016-11-30 22:51:37
【问题描述】:

这是我得到的错误:

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} 不会成为数组中的字符串

【问题讨论】:

    标签: ruby-on-rails ruby sqlite rails-console


    【解决方案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 模型,然后在将集合减少到单个字段时放弃所有这些工作。 pluck选择必填字段,不为结果集构建 AR 对象。

    【讨论】:

      【解决方案2】:

      你的回答真的很有帮助,我遇到了字符串迭代的问题,有效的代码是

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

      【讨论】:

        猜你喜欢
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多