環境
Ruby 2.5.0
Rails 5.2.0
こういったSQLを発行したいときに
1 |
SELECT kind, SUM(id) FROM "books" GROUP BY "books"."kind" ORDER BY SUM(id) |
以下のようなコードを書くと、railsから実行時警告が出力される。
1 |
book = Books.group(:kind).select('kind, SUM(id)').order('SUM(id)') |
警告内容:
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): “SUM(id)”. 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(). (called from __pry__ at (pry):16)
放っておいても動くのは動くのだが、Rails 6.0ではサポートしないから直せと言われているので素直に直す。
警告内容をそのまま読み解けばわかるが、これはArel.sql()
を使えば解消できる。
1 |
book = Books.group(:kind).select('kind, SUM(id)').order(Arel.sql('SUM(id)')) |
pluckなどでも同じことが起きるが、
1 |
book = Book.group(:kind).select('kind, SUM(id)').pluck('SUM(id)') |
これも、Arel.sql()
を使えば警告は消える。
1 |
book = Book.group(:kind).select('kind, SUM(id)').pluck(Arel.sql('SUM(id)')) |