所以我试图在事件记录中处理相当复杂的查询。我正在使用 Rails 4.0 和 mysql。问题是,我的查询需要在 WHERE 语句中使用单引号。
这就是 sql 语句(WHERE 部分)最终需要的样子:
WHERE
`location_hours`.`open_at` <=
hour(CONVERT_TZ(now(), 'US/Mountain',`locations`.`time_zone`)) * 60 * 60
AND
`location_hours`.`close_at` >=
hour(CONVERT_TZ(now(), 'US/Mountain', `locations`.`time_zone`)) * 60 * 60
问题出在“美国/山地”。我尝试了以下两种方法来实现此目的:
1.
string = "hour(CONVERT_TZ(now(), 'US/Mountain', `locations`.`time_zone`)) * 60 * 60";
filtered = filtered.joins(:hours)
.where("`location_hours`.`closed` = ?", false)
.where("`location_hours`.`open_at` <= %s AND `location_hours`.`close_at` >= %s",
string, string)
2.
filtered = filtered.joins(:hours)
.where("`location_hours`.`day` = weekday(CONVERT_TZ(now(), \"US/Mountain\", `locations`.`time_zone`))")
.where("`location_hours`.`closed` = ?", false)
.where("`location_hours`.`open_at` <= hour(CONVERT_TZ(now(), \"US/Mountain\", `locations`.`time_zone`)) * 60 * 60 AND `location_hours`.`close_at` >= hour(CONVERT_TZ(now(), \"US/Mountain\", `locations`.`time_zone`)) * 60 * 60")
第二个选项生成的sql(从控制台复制、粘贴)我可以直接将其作为原始查询放入phpmyadmin,然后得到结果。
出于某种原因,Rails 对我的查询做了一些有趣的事情。任何指示或建议将不胜感激!
谢谢!!
最佳答案
在 SQL 中添加单引号的最简单方法就是将它们放在那里:
.where("location_hours.open_at <= hour(CONVERT_TZ(now(), 'US/Mountain', ...
如果时区位于变量中,则使用占位符:
.where("location_hours.open_at <= hour(CONVERT_TZ(now(), :tz, ...", :tz => time_zone_string)
请记住 SQL 片段,例如
string = "hour(CONVERT_TZ(now(), 'US/Mountain', `locations`.`time_zone`)) * 60 * 60";
不是 SQL 字符串,因此不应转义。这意味着通过 %s
发送它不会做正确的事情,%s
只会弄乱代码片段中的引号。
顺便说一句,您不需要对所有内容进行反引号,只需对关键字、区分大小写、包含空格等标识符进行反引号即可。对所有内容进行反引号只会造成丑陋的困惑。
关于mysql - Rails 错误地转义了我的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337939/