Rails查询使用ILIKE

16
我已经写了一个查找器,代码如下:
@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" 替换: "this is a test"
  2. "He didn't do it" 参数化: "he-didn-t-do-it" 替换: "he didn t do it"
  3. "This & That" 参数化: "this-that" 替换: "this that"
因此,当我在第2部分和第3部分之间进行ILIKE匹配时,它无法创建匹配。第1部分显然可以正常工作。
有什么办法可以使带有特殊字符的字符串得到正确匹配吗?

你使用哪种数据库? - Arup Rakshit
好奇,是否有必要从URL接受搜索参数?我曾经遇到过类似的问题,通过接受POST请求中的搜索参数来解决它。然后,搜索词及其对应的URL将存储在搜索表中,因为这些URL对于SEO非常重要。因此,当有人访问该URL时,它会从数据库中加载该术语并执行搜索。 - coderhs
这是类似于“蛞蝓”或其他东西吗? - Mohammad AbuShady
@MohammadAbuShady 很好的建议。这会使所有事情都变得非常容易。我应该在我的表中添加一个 slug,然后可以基于它进行查询。谢谢! - rctneil
@Coderhs 整个页面都是基于查询字符串参数构建的过滤器和排序器。我可以更改它,使其按照您所说的方式工作,但目前查询字符串是它的工作方式。 - rctneil
显示剩余2条评论
3个回答

23

这是做事的方法:

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

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

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

我认为去掉感叹号(!)会解决你的问题 :) - Sharvy Ahmed
抱歉,但仍然没有任何东西。 - rctneil
% 将忽略该单词前后的单词,#{} 用于 Ruby 字符串操作。 - Sharvy Ahmed
@rctneil,我已经更新了我的答案,你能检查一下吗? - Sharvy Ahmed
% 是 SQL 中的通配符,表示“任意”,类似于其他上下文中的“*”。 - MegaTux
显示剩余2条评论

2

由于这与“slug系统”非常相似,您只需添加一个新字段并将其命名为任何您认为合适的名称,只需不要忘记添加索引以避免在字符串中搜索时浪费时间。

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


最终采用了这种方式。在我的模型中添加了一个slug。通过查询字符串传递slug,然后通过比较参数slug和模型DB slug来找到模型实例。完美地工作了。感谢您的提示! - rctneil

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接