TTIL

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(β)

参考