我正在尝试搜索与特定正则表达式匹配的所有条目。
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/