2010-12-29 13 views
10

Por motivos de rendimiento, tengo que escribir un nuevo método en mi modelo de rieles que se ejecuta alguna SQL arbitrario:cómo ejecutar SQL con parámetros arbitrarios en los carriles

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

entiendo que puedo utilizar ActiveRecord::Base.connection.execute o ActiveRecord::Base.connection.update con una cadena de SQL para obtener los resultados que necesito, pero ¿cuál es el procedimiento adecuado para sustituir los marcadores de posición de los parámetros (?) con los valores de los parámetros reales? ¿Existe un método de Rails para interpolar parámetros en una declaración de SQL, o debería simplemente hacerse por interpolación manual? Este último parece insegura ...

+2

Consulte esta pregunta también: http://stackoverflow.com/questions/4483049/how-to-execute-a-raw-update-sql-with-dynamic-binding-in-rasils/4484549#4484549. –

+0

En segundo lugar el comentario de Brian: el enlace de arriba parece ser la misma pregunta básica. –

Respuesta

7

También puede hacer esto:

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 está llamado id antes to_i en caso de que sea nula.

+0

Esto no responde a la pregunta, ya que utiliza la interpolación de cadenas y, por lo tanto, es vunerable a las inyecciones de SQL. Sí, soy consciente de que está usando una matriz sql "desinfectada", pero hay una larga historia de que estas cosas son un pobre sustituto de la seguridad real. Lo que se solicita es el acceso a consultas parametrizadas, como todos los sistemas sane dbms que han tenido desde la década de 1980. – Shayne

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

A menos que haya entendido mal la pregunta.

Cuestiones relacionadas