我想将 url 字段与 url 前缀(可能包含百分号)进行匹配,例如.where("url LIKE ?", "#{some_url}%")
.
最常用的 Rails 方式是什么?
最佳答案
如果我理解正确,您会担心 some_url
中出现“%”理所当然;您还应该担心嵌入的下划线(“_”),它们是“.”的 LIKE 版本。在正则表达式中。我认为没有任何特定于 Rails 的方法可以做到这一点,所以你只剩下 gsub
:
.where('url like ?', some_url.gsub('%', '\\\\\%').gsub('_', '\\\\\_') + '%')
这里也不需要字符串插值。您需要将反斜杠加倍以从数据库的字符串解析器中转义它们的含义,以便 LIKE 解析器将看到简单的 "\%"并知道忽略转义的百分号。
您应该检查您的日志以确保两个反斜杠通过。通过检查
irb
中的内容,我得到了令人困惑的结果, 使用五个 (!) 得到正确的输出,但我看不出它的意义;如果有人确实看到其中五个的意义,将不胜感激。更新 :Jason King 为逃脱的逃脱角色的噩梦提供了一种简化。这让您可以指定 temporary escape character所以你可以做这样的事情:
.where("url LIKE ? ESCAPE '!'", some_url.gsub(/[!%_]/) { |x| '!' + x })
我也切换到了
gsub
的块形式让它不那么讨厌。这是标准的 SQL92 语法,因此适用于任何支持它的数据库,包括 PostgreSQL、MySQL 和 SQLite。
将一种语言嵌入另一种语言总是有点像噩梦般的混杂,你无能为力。总会有一些丑陋的小点,你只需要笑着忍受。
关于sql - 在 Rails 3/ActiveRecord 中构建 LIKE 查询时逃避 %% 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5709887/