我正在尝试搜索与特定正则表达式匹配的所有条目。

match_rules = "(^|\W)#{word}(\W|$)"
@dogs += Dog.where(["owner REGEXP :term", {:term => match_rules}])


希望这很简单,但是产生的行为有点怪异。生成的sql如下所示:

SELECT `dogs`.* FROM `dogs`  WHERE (name REGEXP '(^|W)doe(W|$)')


当我想要它看起来像是

SELECT `dogs`.* FROM `dogs`  WHERE (name REGEXP '(^|\W)doe(\W|$)')


问题在于它正在删除我的反斜杠符号-查询功能中非常关键的部分!此处明显的错误是,需要对Ruby双引号字符串中的反斜杠进行转义,因此我们可以将其写为

match_rules = "(^|\\W)#{word}(\\W|$)"


并将其保留在我们的字符串中...但是当我尝试将其插入时,我得到:

SELECT `dogs`.* FROM `dogs`  WHERE (name REGEXP '(^|\\W)doe(\\W|$)')


这意味着它会在插入反斜杠之前“转义”这些反斜杠。我该如何预防?

最佳答案

您可以使用单引号来避免对文字进行转义:

match_rules = '(^|\W)#{word}(\W|$)'


另外,您如何检查生成的SQL? Ruby可以根据您使用的API向您显示转义或未转义的内容:

sql = "SELECT `dogs`.* FROM `dogs`  WHERE (name REGEXP '(^|\\W)doe(\\W|$)')"
puts sql
# SELECT `dogs`.* FROM `dogs`  WHERE (name REGEXP '(^|\W)doe(\W|$)')
p sql
# "SELECT `dogs`.* FROM `dogs`  WHERE (name REGEXP '(^|\\W)doe(\\W|$)')"

关于mysql - 如何在Ruby/Rails ActiveRecord SQL条件中包含反斜杠?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23851615/

10-13 06:54