2013-02-13 5 views
0

Разочарованный ActiveRecord, который производит неэффективные или ошибочные запросы DELETE, я ищу возможность выполнять прямой SQL-запрос безопасным образом, без возможности SQL-инъекции.Вопросительные знаки в прямом SQL-запросе

Я знаю, что есть безопасный вариант ИНЕК:

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]) 

ответ

1

К сожалению, я не думаю, что есть более простой способ, который может использовать соединения. Но, по крайней мере, для условий есть многоразовые помощники по санитарии.

См. ActiveRecord::Base#sanitize_sql (docs).

Model.send(:sanitize_sql, {:foo => "bar"}) 
-3

Почему ты не попробовать это:

выполнить (< < -SQL

УДАЛИТЬ ИЗ my_objects С ИСПОЛЬЗОВАНИЕМ детали ГДЕ my_objects.details_id = details.id И my_objects.my_value = # {params [: value]} AND details.my_id = # {params [: id]}

SQL

Смежные вопросы