Rails 用 ILIKE 查询

Rails Query with ILIKE

我写了一个finder如下:

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

params[:manufacturer] 以字符串形式出现,已被 Rails 处理 .parameterize

问题是 ILIKE 无法正确匹配其中包含“'”或“&”的字符串。

例如,存储在我的数据库中的一些字符串及其参数化版本:

  1. "This is a test" 参数化:"this-is-a-test" gsubbed:"this is a test"
  2. "He didn't do it" 参数化:"he didn-t-do-it" gsubbed:"he didn t do it"
  3. "This & That" 参数化:"this-that" gsubbed:"this that"

所以当我在 2 的第一部分和 2 的第三部分之间执行 ILIKE 时,它不会创建匹配项。与 3 相同。1 显然工作正常。

知道如何在字符串中包含特殊字符的情况下获得正确匹配吗?

方法是这样的:

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

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

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

由于这与 slug 系统非常相似,您应该只添加一个新字段并将其命名为您认为合适的任何名称,只是不要忘记添加一个 index 这样您就不会浪费时间在字符串中搜索。

您还可以添加一个 before_createbefore_save 回调以在您保存对象时以您计划搜索的格式自动创建它。

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