ActiveRecord: SQL, устойчивый к инъекциям - PullRequest
1 голос
/ 20 июня 2011

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

params = {:filter_column => "column_name", :filter_string => "search term"}

Я знаю, что если бы я просто вызывал стандартную сортировку, где в моей модели это было бы следующим образом:1004 *

ModelName.where("column_name LIKE ?", params[:filter_string])

Проблема, с которой я столкнулся, заключается в том, что я пытаюсь составить список своих фильтров, а затем применить их по одному к поиску.Могу ли я создать строку where перед вызовом метода where?

Я пробовал:

ModelName.where("? LIKE ? ", column_name, search_term)

без особой удачи.Любые советы, подсказки или указатели?

спасибо!

Ответы [ 2 ]

2 голосов
/ 20 июня 2011

Возможно, вы захотите попробовать решение, которое использует Metawhere Gem

Я думаю что-то вроде:

Model.where(params[:filter_column].intern.matches => params[:filter_string])

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

0 голосов
/ 20 июня 2011

Если только вы можете изменить содержание column_name (т.е. нет риска инъекции), использование

ModelName.where("`#{column_name}` LIKE ?", search_term)
не повредит
...