sql - 在 Rails 3/ActiveRecord 中构建 LIKE 查询时逃避 %% 的正确方法

标签 sql ruby-on-rails ruby-on-rails-3 rails-activerecord

我想将 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/

相关文章:

sql - 将不同的行属性转置/旋转为列并将另一个属性分组?

ruby-on-rails - 使用外部 SMTP 在 Heroku 上发送电子邮件

ruby-on-rails - Ruby 遍历 CSV 行并绕过值

ruby-on-rails-3 - Heroku应用程序崩溃(错误H10)

ruby-on-rails - 简单地使用 rails 密码保护页面 - 我该怎么办?

MYSQL 将分组依据应用于排名列

mysql - 如何为仅在与另一列组合时需要唯一的列添加唯一约束?

ruby - 如何使用 Rails 创建带有公式的电子表格?

sql - 如何将 postgres 数据库表的主键从账单号更改为账单号和购买日期列的年份部分(它是 oif 类型日期)?

ruby-on-rails - accepts_nested_attributes_for 的构建参数问题