如何正确转义 Active Record where 子句中的正则表达式
How to properly escape a regular expression in Active Record where clause
我正在使用 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
产量
"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@.]gmail.com')"
User.where("email REGEXP ?", "[@\.]gmail\.com").to_sql
产量
"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@.]gmail.com')"
User.where("email REGEXP ?", "[@\.]gmail\.com").to_sql
产量
"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@\\.]gmail\\.com')"
如何让 Active Record 正确转义 SQL?
当使用 to_sql
时,控制台中的转义看起来是错误的,你的最后一个例子实际上将它发送到 MySQL:
SELECT `users`.* FROM `users` WHERE (email REGEXP '[@\.]gmail\.com')
您可以通过 运行 控制台中的实际查询和检查日志文件来确认这一点。
我正在使用 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
产量
"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@.]gmail.com')"
User.where("email REGEXP ?", "[@\.]gmail\.com").to_sql
产量
"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@.]gmail.com')"
User.where("email REGEXP ?", "[@\.]gmail\.com").to_sql
产量
"SELECT `users`.* FROM `users` WHERE (email REGEXP '[@\\.]gmail\\.com')"
如何让 Active Record 正确转义 SQL?
当使用 to_sql
时,控制台中的转义看起来是错误的,你的最后一个例子实际上将它发送到 MySQL:
SELECT `users`.* FROM `users` WHERE (email REGEXP '[@\.]gmail\.com')
您可以通过 运行 控制台中的实际查询和检查日志文件来确认这一点。