gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:48:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com