1. ホーム
  2. ruby-on-rails

[解決済み] railsで動的バインディングを使用して生の更新SQLを実行する方法

2022-10-13 20:49:05

質問

以下のようなraw sqlで1回だけ更新を実行したい。

update table set f1=? where f2=? and f3=?

このSQLは ActiveRecord::Base.connection.execute で実行されますが、動的なパラメータ値をメソッドに渡す方法がわかりません。

誰か私にそれについてのヘルプを与えることができますか?

どのように解決するのですか?

Rails APIはこれを一般的に行うためのメソッドを公開していないようです。MySQLのように、基礎となる接続にアクセスして、そのメソッドを使用してみてはいかがでしょうか。

st = ActiveRecord::Base.connection.raw_connection.prepare("update table set f1=? where f2=? and f3=?")
st.execute(f1, f2, f3)
st.close

これを行うことで他の影響があるかどうかはわかりません(接続が開かれたままになっているなど)。実際のクエリ以外に何を行っているのか、通常の更新のRailsコードをトレースしてみたいと思います。

プリペアドクエリを使用すると、データベースでわずかな時間を節約できますが、これを100万回連続で行わない限り、おそらく通常のRuby置換で更新を構築する方がよいでしょう、たとえば

ActiveRecord::Base.connection.execute("update table set f1=#{ActiveRecord::Base.sanitize(f1)}")

を使うか、コメント欄にあるようなActiveRecordを使うかです。