使用ILIKE进行Rails查询

时间:2015-02-21 18:37:16

标签: sql ruby-on-rails parameters find

我写了一个发现者如下:

@cars = @cars.joins(:manufacturers).where("manufacturers.name ILIKE ?", params[:manufacturer].gsub!(/-/, ' '))

params[:manufacturer]以Rails的.parameterize字符串的形式出现。

问题是带有“'”或“&”的字符串在它中没有正确地与ILIKE匹配。

举个例子,我的数据库中存储了一些字符串及其参数化版本:

  1. “这是一个测试”参数化:“这是一个测试”gsubbed:“这是一个测试”
  2. “他没有这样做”参数化:“他没有做到这一点”gsubbed:“他没有这样做”
  3. “This& That”参数化:“this-that”gsubbed:“this that”
  4. 因此,当我在2的前半部分和2的第三部分之间进行ILIKE时,它不会创建匹配。与3.相同.1显然工作正常。

    即使字符串中包含特殊字符,如何获得正确匹配的任何想法?

3 个答案:

答案 0 :(得分:8)

这是做到这一点的方法:

@cars = @cars.joins(:manufacturers).where("manufacturers.name LIKE ?", "%#{params[:manufacturer].parameterize}%")

顺便说一句,你可以做到这一点,它看起来更干净:

search = params[:manufacturer].parameterize
@cars = @cars.joins(:manufacturers).where("manufacturers.name LIKE ?", "%#{search}%")

答案 1 :(得分:2)

由于这与slug系统很相似,你应该添加一个新的字段,并在你认为合适的地方调用它,不要忘记添加一个index,这样你就不会这样做。浪费时间搜索字符串。

此外,您可以添加before_createbefore_save回调,以便以您计划搜索的格式保存对象时自动创建它。

答案 2 :(得分:1)

使用 sanitize_sql_like 方法正确转义特殊字符。