mysql - Rails 错误地转义了我的查询

标签 mysql ruby ruby-on-rails-3 activerecord ruby-on-rails-4

所以我试图在事件记录中处理相当复杂的查询。我正在使用 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/

相关文章:

ruby-on-rails - 如何获取当前 Controller 的实例变量?

mysql - Rails 4.2 Query 3模型以及belongs_to和has_one无法根据子属性获取父级

mysql - 在 NodeJS 中传递键值数组以进行 MySQL 选择查询

php - UsersModel::myFunc()的返回值必须是字符串类型,返回对象

mysql - 在mysql中连接两个表

ruby - 如何使用本地源目录中的代码替换 Ruby gem

ruby-on-rails - minitest: 未定义的方法 `get'

ruby - 你如何在 Redis/Ohm 中动态地将元素推送到列表中?

ruby-on-rails - 我什么时候应该重新启动 webrick,什么时候不应该?

jquery - 取消在 Rails 远程 form_for 上提交