我写了一个发现者如下:
@cars = @cars.joins(:manufacturers).where("manufacturers.name ILIKE ?", params[:manufacturer].gsub!(/-/, ' '))
params[:manufacturer]
以Rails的.parameterize
字符串的形式出现。
问题是带有“'”或“&”的字符串在它中没有正确地与ILIKE匹配。
举个例子,我的数据库中存储了一些字符串及其参数化版本:
因此,当我在2的前半部分和2的第三部分之间进行ILIKE时,它不会创建匹配。与3.相同.1显然工作正常。
即使字符串中包含特殊字符,如何获得正确匹配的任何想法?
答案 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_create
或before_save
回调,以便以您计划搜索的格式保存对象时自动创建它。
答案 2 :(得分:1)
使用 sanitize_sql_like 方法正确转义特殊字符。