find_by_sql и одинарные кавычки в предложении ORDER BY - PullRequest
3 голосов
/ 09 августа 2011

Рельсы 2.3.5

Я знаю, что должен делать find_by_sql с санированными переменными, такими как:

sql = %Q{
SELECT blah
FROM blah
ORDER BY ? DESC
      } 

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

sql = %Q{
SELECT blah
FROM blah
ORDER BY #{params[:sort]} DESC
      }

Каков наилучший способ справиться с необходимостью санации varialbe в предложении ORDER BY? Спасибо!

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Может быть, немного взломать, но иногда я избегаю params, как это.

sql = AnyActiveRecordModel.send(:sanitize_sql_array, ["SELECT blah FROM blah ORDER BY ? DESC", params[:sort])

sanitize_sql_array - это метод закрытого класса активной модели записи, и таким образом вы можете получить к нему доступ. Это тот же метод, который используется в условиях AR находки

AnyActiveRecordModel.find(:all, :conditions => ["condition = ?",params[:blah]]

Это грязно, но я не знал, как решить это лучше, и у меня было ограничение по времени: P

0 голосов
/ 21 сентября 2014

Вы можете сделать свою собственную дезинфекцию.Что-то вроде

field = [column_names & [params[:field]]].first
#or field = column_names.detect{|name| name == params[:field]}, etc

direction = (%w[ASC DESC USING] & [params[:order].upcase]).first

"ORDER BY #{field} #{direction}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...