2010-07-07 77 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注入自动受到保护。