find_by_sql和ORDER BY子句中的单引号

时间:2011-08-09 11:32:59

标签: ruby-on-rails

Rails 2.3.5

我知道我应该使用sanatized变量做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
      }

在ORDER BY子句中处理需要sanatized varialbe的最佳方法是什么?谢谢!

2 个答案:

答案 0 :(得分:1)

也许有点黑客但我有时会像这样逃避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

答案 1 :(得分:0)

你可以做自己的消毒。

的内容
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}"