right rails query outer left joins inner ruby-on-rails ruby-on-rails-4 parameters left-join

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)}")