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 句が原因で動作しなくなりました。

タイプdatetimeの列starts_atを持つテーブルeventsがあります。

ルビーコード:

@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 BY convert(date, starts_at, 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 BY convert(date ASC, starts_at ASC, 112) ASC

order by の周りの部分に注意してください。

ORDER BY convert(date ASC, starts_at ASC, 112) ASC

ORDER BY convert(date, starts_at, 112) の代わりに

このため、次のエラーが発生します。

TinyTds::エラー: キーワード 'ASC' 付近の構文が正しくありません。:

このようなクエリに従う必要がある構文の変更はありますか、それとも使用しているバージョンが正しくありませんか? rails 3.0.1 から rails 3.0.20 への移行の一環として、tiny_tds と activerecord-sqlserver-adapter をアップグレードする必要がありました。

ありがとうございました。

4

1 に答える 1

1

3.0.8 の時点で、Arel が order by 句を解析する方法を修正しようとするモンキー パッチが適用されているようです: クラス SelectManager、メソッド 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 に答える