ruby on rails - query - Unión parametrizada en Rails 4
rails sql query (4)
Estoy haciendo una join
manual y necesito pasar un parámetro a su cláusula ON
:
Foo.joins("LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.baz = #{baz}")
¿Hay alguna manera de pasar baz
como parámetro para evitar posibles problemas de inyección? Hay un método sanitize_sql_array
, pero no estoy seguro de cómo usarlo en este caso.
Nota: No puedo usar el where
porque no es lo mismo.
Creo que deberías intentarlo así:
Foo.joins("LEFT OUTER JOIN bars ON foo.id = bars.foo_id AND bars.baz = ?", baz)
Con más parámetros:
Foo.joins("LEFT OUTER JOIN bars ON foo.id = ? AND bars.baz = ? AND ...", foo, baz, etc...)
Con sanitize_sql_array, eso sería:
# Warning: sanitize_sql_array is a protected method, be aware of that to properly use it in your code
ar = ["LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.baz = %s", baz]
# Within foo model:
sanitized_sql = sanitize_sql_array(ar)
Foo.joins(sanitized_sql)
Lo intenté y funcionó.
Debería estar seguro si pasa un hash de valores, AR lo protegerá contra las inyecciones de SQL, así:
Foo.joins("LEFT OUTER JOIN bars ON foo.id = bars.foo_id").where(bars: {baz: baz})
Simplemente no use cadenas de filas en sql que sean vulnerables a la inyección sql.
Los modelos de registro activos tienen un método de sanitize
clase, por lo que podría hacer:
Foo.joins("LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.baz = #{Foo.sanitize(baz)}")