如何在rails中执行任意参数化SQL

如何在rails中执行任意参数化SQL,sql,ruby-on-rails,sql-injection,Sql,Ruby On Rails,Sql Injection,出于性能原因,我需要在Rails模型中编写一个新方法来执行一些任意SQL: UPDATE table SET col1 = ? AND col2 = ? WHERE id = ? 我知道我可以使用ActiveRecord::Base.connection.execute或ActiveRecord::Base.connection.update,使用一个SQL字符串来获得我需要的结果,但是用实际参数值替换参数占位符(?)的正确过程是什么?是否有一种Rails方法可以将参数插入SQL语

出于性能原因,我需要在Rails模型中编写一个新方法来执行一些任意SQL:

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

我知道我可以使用
ActiveRecord::Base.connection.execute
ActiveRecord::Base.connection.update
,使用一个SQL字符串来获得我需要的结果,但是用实际参数值替换参数占位符(
)的正确过程是什么?是否有一种Rails方法可以将参数插入SQL语句中,还是应该通过手动插入来完成?后者似乎不安全…

您也可以这样做:

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
to_i
之前被调用
id
以防为零。

也检查这个问题:。我支持Brian的评论-上面的链接似乎是相同的基本问题。这并没有回答问题,因为它使用字符串插值,因此SQL注入是不可能的。是的,我知道它使用的是“净化”sql数组,但长期以来,这些东西都不能很好地替代实际的安全性。所要求的是访问参数化查询,就像自20世纪80年代以来所有sane dbms系统一样。