如何在Active Record的where子句中正确转义正则表达式

3

我正在使用 Active Record v4.2.1 查询一个 mySQL 数据库,使用正则表达式。我想要创建以下 SQL:

SELECT `users`.* FROM `users` WHERE (email REGEXP '[@\.]gmail\.com')

然而,我似乎找不到使用Active Record创建SQL的正确方法。


User.where("email REGEXP ?", "[@.]gmail.com").to_sql

yields

"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@.]gmail.com')"

User.where("email REGEXP ?", "[@\.]gmail\.com").to_sql

yields

"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@.]gmail.com')"

User.where("email REGEXP ?", "[@\\.]gmail\\.com").to_sql

yields

"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@\\\\.]gmail\\\\.com')"

如何让Active Record正确转义SQL语句?

1个回答

2

在使用to_sql时,控制台中的转义看起来很奇怪,你最后一个例子实际上发送到MySQL的是:

SELECT `users`.* FROM `users` WHERE (email REGEXP '[@\\.]gmail\\.com')

您可以通过在控制台中运行实际查询并检查日志文件来确认此事。

明白了。这似乎是关于为什么 \\\ 是好的一个很好的解释:https://dev59.com/nGrXa4cB1Zd3GeqPEO_E#13415109 - Nick Q.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接