Как выполнить произвольный параметризованный SQL в рельсах

По соображениям производительности мне нужно написать новый метод в моей модели Rails, который выполняет произвольный SQL:

UPDATE table
   SET col1 = ? AND col2 = ?
   WHERE id = ?

Я понимаю, что я могу использовать ActiveRecord::Base.connection.execute или ActiveRecord::Base.connection.update со строкой SQL, чтобы получить нужные мне результаты, но какова правильная процедура для замены подстановщиков параметров (?) фактическими значениями параметров? Есть ли метод Rails для интерполяции параметров в SQL-запрос, или это должно быть сделано только путем ручной интерполяции? Последнее кажется небезопасным...

Ответ 1

Вы также можете сделать это:

updates = ActiveRecord::Base.send(:sanitize_sql_array, ["name = ? and category = ?", name, category])
ActiveRecord::Base.connection.execute("update table set #{updates} where id = #{id.to_s.to_i}")

to_s вызывается на id до to_i в случае его отсутствия.

Ответ 2

Table.where(id:id).update_all(col1:val1, col2:val)

Если я не понял этот вопрос.