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的最佳方法是什么?谢谢!
答案 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}"