Rails 5.2 で以下のように Arel.sql
を使ってセキュアな文字列であることを明示するという警告が出るようになっていたのは、多くの Rails アプリケーション開発者が通ってきているように思える。
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "対象のSQL文字列". Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql().
新しい Rails であれば、不必要な Arel.sql
(いわゆる false alarm) を抑制できるという話を思い出したので、rails/rails のコミットを調べて Oracle も同様の対応をした。
余談だが Oracle は NULLS FIRST
, NULLS LAST
をサポートしているのでその対応も入っている。
新しい Rails と言っているのは、この Oracle 向けパッチを書いた時点では Arel.sql
の false alarm への抑制に次の Rails 6.1 が必要だと思っていたところ kamipo さんから Rails 6.0 にも入っているというコメントをもらった (なんといういい仕事!) 。
いうてこの変更は6.0に滑り込ませてるのでRails 6.0でもだいたいRails 6.1と同じぐらいfalse alarmを抑制してますよ。
— Ryuta Kamizono (@kamipo) 2020年5月21日
なので Rails 6.0 にして不要な Arel.sql
を除去すれば、いきなり Arel
という文字列を見てなんぞという初見でちょっとビビらせる機会が減るのではと思う。
Oracle enhanced adapter の 6.0 ブランチの方にもバックポートしておいたので、そちらは次のリリースで対応される見込みです。
Rails 5.2が出る頃に Arel.sql
について日記を書いていたので、今回 2年半越しに良い話を書けたのだった。