obj.update_attribute(:only_one_field, 'Some Value')
obj.update_attributes(field1: 'value', field2: 'value2', field3: 'value3')这两种方法都将更新一个对象,而不必显式地告诉ActiveRecord更新。
Rails API说:
update_attribute 更新单个属性并保存记录,而无需经过正常的验证过程。这对于现有记录上的布尔标志特别有用。当验证模块混合(默认情况下是这样)时,Base中的常规update_attribute方法将被替换为此方法。update_attributes 更新传入哈希的所有属性并保存记录。如果对象无效,则保存将失败,并返回false。
因此,如果我不想对对象进行验证,我应该使用#update_attribute。如果我在#before_save上有这个更新,它会发生堆栈溢出吗?
我的问题是,#update_attribute是否也绕过了以前的保存或只是验证。
另外,将散列传递给#update_attributes的正确语法是什么.看看我在上面的例子。
发布于 2010-05-06 05:32:09
请参考update_attribute。单击“显示源”,您将得到以下代码
# File vendor/rails/activerecord/lib/active_record/base.rb, line 2614
2614: def update_attribute(name, value)
2615: send(name.to_s + '=', value)
2616: save(false)
2617: end现在参考update_attributes并查看它的代码
# File vendor/rails/activerecord/lib/active_record/base.rb, line 2621
2621: def update_attributes(attributes)
2622: self.attributes = attributes
2623: save
2624: end两者的区别是update_attribute使用save(false),而update_attributes使用save,或者可以说是save(true)。
很抱歉描述得太长了,但我想说的很重要。save(perform_validation = true),如果perform_validation是假的,它会绕过(跳过将是正确的词)与save相关的所有验证。
关于第二个问题
另外,将散列传递给update_attributes的正确语法是什么.看看我在上面的例子。
你的例子是正确的。
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")或
Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"或者,如果您在散列中获得所有字段数据&名称,比如这里的params[:user],只使用
Object.update_attributes(params[:user])发布于 2012-06-27 13:11:14
提示:在Rails 4中,update_attribute是通过提交a7f4b0a1被废弃的。它移除update_attribute以支持update_column。
发布于 2013-01-21 10:42:46
update_attribute
该方法在不调用模型验证的情况下更新对象的单个属性。
obj = Model.find_by_id(params[:id])
obj.update_attribute :language, “java”update_attributes
该方法更新单个对象的多个属性,并通过基于模型的验证。
attributes = {:name => “BalaChandar”, :age => 23}
obj = Model.find_by_id(params[:id])
obj.update_attributes(attributes)希望这个答案能澄清什么时候使用什么方法的活动记录。
https://stackoverflow.com/questions/2778522
复制相似问题