2021-12-16 Rails pluck/order SQL sanitization
Rails pluck/order SQL sanitization
下記のPRで ActiveRecord 下記の記述ができるようになった。
Support SQL sanitization in AR::QueryMethods#order by ktheory · Pull Request #13008 · rails/rails
Tag.order(['field(id, ?)', [1,3,2])
ただ、この書き方は最新のRailsだと怒られる。
ActiveRecord::UnknownAttributeReference: Query method called with non-attribute argument(s): "FIELD(id, ?)"
from /usr/local/bundle/gems/activerecord-6.1.4.1/lib/active_record/sanitization.rb:145:in `disallow_raw_sql!'
下記のコミットで変わっているようにちゃんと Arel.sql
で文字列を囲んで sanitization する必要がある。
https://github.com/rails/rails/commit/b76cc29865fb69389ffdb7bd9f8085aa86354f82
sanitize_sql_for_order
sanitize_sql_for_order([Arel.sql("field(id, ?)"), [1,3,2]])
# => "field(id, 1,3,2)"
ref. ActiveRecord::Sanitization::ClassMethods | RailsDoc(β)