2010-12-29 7 views
10

内の任意のパラメータ化されたSQLを実行する方法を、私はいくつかの任意のSQLを実行し、私のRailsのモデルに新たなメソッドを記述する必要があります。パフォーマンス上の理由からレール

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

私は文字列でActiveRecord::Base.connection.executeまたはActiveRecord::Base.connection.updateを使用することができます理解私は必要な結果を得るためにSQLを使用しますが、パラメータプレースホルダ(?)を実際のパラメータ値に置き換える適切な手順は何ですか? SQL文にパラメータを補間するためのRailsメソッドがありますか、それとも手動補間で行うべきですか?後者はあなたにもこれを行うことができ

+2

この質問を調べる:http://stackoverflow.com/questions/4483049/how-to-execute-a-raw-update-sql-with-dynamic-binding-in-rails/4484549#4484549 –

+0

私は2番目のブライアンのコメント - 上記のリンクは同じ基本的な質問と思われる。 –

答えて

7

...危険なようだ:

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を、それがnilだ場合にto_iidに呼び出されています。

+0

これは文字列の補間を使用しているため、SQLインジェクションには耐えられないので、この質問には答えません。はい、私はそれが "浄化された" SQL配列を使用していることを認識していますが、これらの事柄が実際のセキュリティの貧弱な代用品であるという長い歴史があります。何が求められているのは、1980年代以来、すべてのsane dbmsシステムが持っていたように、パラメータ化されたクエリへのアクセスです。 – Shayne

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

私が質問を誤解していない限り。

関連する問題