对ActiveRecord感到失望,它产生低效或错误的DELETE查询,我正在寻找一种能够以安全的方式执行直接SQL查询的能力,没有SQL注入的可能性。
我知道WHERE子句有一个安全的变体:
MyObject.joins(:details)
.where('my_objects.my_value = ? and details.my_id = ?',
params[:value], params[:id])
execute
的安全变体是否存在?类似的东西:
execute(<<eos
DELETE FROM my_objects
USING details
WHERE
my_objects.details_id = details.id
AND my_objects.my_value = ?
AND details.my_id = ?
eos
, params[:value], params[:id])
答案 0 :(得分:1)
不幸的是,我认为有一种更简单的方法可以使用连接。但至少可以为这些条件提供可重复使用的卫生助手。
请参阅ActiveRecord::Base#sanitize_sql
(docs)。
Model.send(:sanitize_sql, {:foo => "bar"})
答案 1 :(得分:-3)
为什么不试试这个:
执行(小于;&LT; -SQL
从my_objects中删除 使用细节 哪里 my_objects.details_id = details.id AND my_objects.my_value =#{params [:value]} AND details.my_id =#{params [:id]}
SQL