0

非効率的またはバグのあるDELETEクエリを生成するActiveRecordに失望しているので、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])
4

2 に答える 2

1

残念ながら、結合を利用できる簡単な方法はないと思います。しかし、少なくとも条件に合わせて再利用可能な衛生ヘルパーがあります.

ActiveRecord::Base#sanitize_sql(ドキュメント)を参照してください。

Model.send(:sanitize_sql, {:foo => "bar"})
于 2013-02-14T04:28:01.717 に答える
-3

これを試してみませんか:

execute(<<-SQL

DELETE FROM my_objects USING details WHERE my_objects.details_id = details.id AND my_objects.my_value = #{params[:value]} AND details.my_id = #{params[:id]}

SQL

于 2013-02-14T00:45:49.090 に答える