2015-07-06 2 views
0

В а, где оператор, вы можете использовать переменные, как:? в ActiveRecord выбрать

Order.where('employee_id = ?', params[:employee_id]) 

Я пытаюсь сделать что-то подобное с отборное, но это не работает:

Order.select('amount FROM line_items WHERE employee_id = ? AS employee_line_items', params[:employee_id]) 
=> ERROR: syntax error at or near "1" 
=> LINE 1: ...ployee_id" = ? AS employee_line_items, 1 

Что происходит Вот? Можно ли использовать ? в select statement? Если нет, то как вы можете вставить скрытую строку sql здесь? Я хотел бы просто использовать #{params[:employee_id]}, но этот бит кода был бы уязвим для SQL-инъекции.

ответ

1

Вы должны разделить ваш запрос и приковать его:

Order.select('amount FROM line_items').where(['WHERE employee_id = ?', params[:employee_id]]) 

А также на основе этого question, я полагаю, вы не можете использовать AS в WHERE пункте, только при выборе полей (и вы не можете их использовать в WHERE в любом случае)

Проверьте documentation, чтобы понять, как select работает на моделях ActiveRecord

+0

Это можно использовать как в сочетании с оТ, даже в предложение WHERE. В любом случае, спасибо за подсказку. Хорошо знать, что мы просто не можем использовать '?' Здесь. Закончилось с '# {ActiveRecord :: Base :: sanitize (params [: employee_id])}'. – nullnullnull

+1

Если вы уверены, что 'AS' может использоваться даже в предложении where, тогда' Order.select ('amount FROM line_items'). Where (['WHERE employee_id =? AS employee_line_items', params [: employee_id]]) 'it's отлично, вы должны избегать «ActiveRecord :: Base.sanitize» любой ценой, это не просто вопрос безопасности, '?' гарантирует, что рельсы генерируют подготовленные операторы, которые очень оптимизированы на стороне базы данных. 'где (['SQL', param1, param2])' 'часть' SQL' может содержать в основном любой действительный sql, доступный в разделе WHERE' –

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