2010-07-07 133 views

回答

4

是的,它的確如此。在內部,它只是遍歷所有屬性,設置它們的值然後調用保存!

def update_attributes(attributes) 
    with_transaction_returning_status do 
    self.attributes = attributes 
    save 
    end 
end 

def attributes=(new_attributes, guard_protected_attributes = true) 
    ... 
    attributes.each do |k, v| 
    if k.include?("(") 
     multi_parameter_attributes << [ k, v ] 
    elsif respond_to?("#{k}=") 
     send("#{k}=", v) 
    else 
     raise(UnknownAttributeError, "unknown attribute: #{k}") 
    end 
    end 
end 

換句話說,它的作用是

m.update_attributes(:attr1 => "foo", :attr2 => "bar") 

m.attr1 = "foo" 
m.attr2 = "bar" 
m.save 
2

Rails3中與數據庫交互的所有activerecord方法對於sql注入都是安全的。

唯一的例外是,如果你使用原始SQL的選項之一,例如:

Comment.find(:all, :conditions => "user_id = #{params[:user]}") 

首選的形式是:

Comment.find(:all, :conditions => {:user_id => params[:user}) 

這將防止SQL注入自動受到保護。