1

我有rails 3.0.1 和 tiny_tds 0.2.3 和 activerecord-sqlserver-adapter 3.0.7,下面的查询工作正常。升级到 rails 3.0.20、tiny_tds 0.4.3、activerecord-sqlserver-adapter 3.0.19后,由于 order by 子句而停止工作。

有一个表events,其列starts_at的类型为datetime

红宝石代码:

@events = Event.where("archived = 'False' and starts_at >= ? and event_company_id in (1,2,3)", start_date).select(" distinct top(14) convert(date, starts_at, 112) as start_date").order("convert(date, starts_at, 112)")

用于生成sql查询如下:

SELECT distinct top(14) convert(date, starts_at, 112) as start_date FROM [events] WHERE (archived = 'False' and starts_at >= '2013-02-04' and event_company_id in (1,2,3)) ORDER通过转换(日期,开始时间,112)

但是现在,正在生成的查询是:

SELECT distinct top(14) convert(date, starts_at, 112) as start_date FROM [events] WHERE (archived = 'False' and starts_at >= '2013-02-05' and event_company_id in (1,2,3)) ORDER通过转换(日期 ASC,starts_at ASC,112)ASC

请注意 order by 周围的部分:

ORDER BY 转换(日期 ASC,starts_at ASC,112)ASC

而不是 ORDER BY convert(date, starts_at, 112)

因此,我收到以下错误:

TinyTds::Error:关键字“ASC”附近的语法不正确。:

此类查询是否需要遵循一些语法更改,或者我使用的版本不正确?作为从 rails 3.0.1 迁移到 rails 3.0.20 的一部分,我不得不升级 tiny_tds 和 activerecord-sqlserver-adapter

谢谢你。

4

1 回答 1

1

从 3.0.8 开始,似乎有猴子补丁试图修复 Arel 解析 order by 子句的方式: class SelectManager, method order(*expr)

如果您将字符串传递给 order 子句,它将简单地用逗号分割字符串以获得列名数组。如果您按函数排序,那么它将完全破坏 order by 子句。好消息是,您可以通过将类似这样的内容传递给 order 子句来防止这种失败的拆分:

order(
  Arel::Nodes::Ordering.new(
    Arel::Nodes::SqlLiteral.new("convert(date, starts_at, 112)")
  )
)

函数调用将按原样传递给 sql 语句生成器

于 2013-09-29T14:01:53.950 回答