find 的 :conditions 參數對應 SQL WHERE 子句,ActiveRecord 提供安全的參數化機制防止 SQL Injection。
pos = Order.find(:all, :conditions => "name = 'dave' and pay_type = 'po'")
# 不要這樣做!
name = params[:name]
pos = Order.find(:all, :conditions => "name = '#{name}' and pay_type = 'po'")
name = params[:name] pos = Order.find(:all, :conditions => ["name = ? and pay_type = 'po'", name])
問號依序對應陣列後續元素,ActiveRecord 自動處理引號跳脫與型別轉換。
name = params[:name]
pay_type = params[:pay_type]
pos = Order.find(:all,
:conditions => ["name = :name and pay_type = :pay_type",
{:name => name, :pay_type => pay_type}])
pos = Order.find(:all, :conditions => ["name = :name and pay_type = :pay_type", params])
所有參數化方式皆會妥善處理 SQL 跳脫,有效防禦注入攻擊。