2010-12-29 8 views
10

Aus Performance-Gründen Schienen, ich brauche eine neue Methode in meinem Rails-Modell zu schreiben, die eine beliebige SQL ausführt:Wie beliebigen parametrisierte SQL ausführt in

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

Ich verstehe ich ActiveRecord::Base.connection.execute oder ActiveRecord::Base.connection.update mit einem String verwenden kann von SQL, um die Ergebnisse zu erhalten, die ich brauche, aber was ist die richtige Prozedur, um die Parameter-Platzhalter (?) durch die tatsächlichen Parameterwerte zu ersetzen? Gibt es eine Rails-Methode zum Interpolieren von Parametern in eine SQL-Anweisung oder sollte sie nur manuell interpoliert werden? Letzteres scheint unsicher ...

+2

Überprüfen Sie diese Frage auch: http://stackoverflow.com/questions/4483049/how-to-execute-a-raw-update-sql-with-dynamic-binding-in-rails/4484549#4484549. –

+0

Ich zweitens Brians Kommentar - der obige Link scheint die gleiche grundlegende Frage zu sein. –

Antwort

7

Sie auch dies tun könnte:

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 auf id vor to_i in Fall aufgerufen wird, es ist gleich Null.

+0

Dies beantwortet die Frage nicht, da sie die String-Interpolation verwendet und daher SQL-Injektionen unterliegt. Ja, ich weiß, dass es "sanitized" SQL-Array verwendet, aber es ist eine lange Geschichte dieser Dinge ein schlechter Ersatz für die tatsächliche Sicherheit. Gefragt ist der Zugriff auf parametrisierte Abfragen, wie sie alle gängigen dbms-Systeme seit den 1980er Jahren hatten. – Shayne

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

Sofern ich die Frage nicht missverstanden habe.