Por motivos de rendimiento, necesito escribir un nuevo método en mi Rieles modelo que ejecuta SQL arbitrario:

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

Entiendo que puedo usar ActiveRecord::Base.connection.execute o ActiveRecord::Base.connection.update con una cadena de SQL para obtener los resultados que necesita, pero ¿cuál es el procedimiento adecuado para la sustitución de los marcadores de posición de parámetro (?) con los valores de parámetro real? Hay un Rieles método de interpolación de parámetros en una declaración SQL, o en caso de que acaba de ser hecho por el manual de interpolación? El último parece peligroso…

Echa un vistazo a esta pregunta también: stackoverflow.com/questions/4483049/….
En la segunda Brian comentario – el enlace de arriba parece ser la misma pregunta básica.

OriginalEl autor nohat | 2010-12-29

1 Comentario

  1. 7

    También se podría 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 se llama en id antes de to_i en caso de que sea nulo.

    Esto no es responder a la pregunta, ya que utiliza la interpolación de cadenas y por lo tanto es vulnerable a inyecciones SQL. Sí, soy consciente de que su uso «sanitized» sql matriz, pero hay una larga historia de estas cosas, un pobre sustituto de la seguridad real. Lo que se está pidiendo es el acceso a consultas con parámetros como toda persona en sus cabales dbms sistemas han tenido desde la década de 1980.

    OriginalEl autor Zubin

Dejar respuesta

Please enter your comment!
Please enter your name here