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方法将被this替换。
update_attributes
更新传入哈希中的所有属性并保存记录。如果对象无效,保存将失败,并返回false。
所以如果我不想验证对象,我应该使用#update_attribute。如果我在#before_save上有这个更新,它会stackoverflow吗?
我的问题是#update_attribute是否也绕过了之前的保存或只是验证。
另外,传递散列到#update_attributes…的正确语法是什么?请查看顶部的示例。
请参考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(true)。
抱歉描述太长了,但我想说的是重要的。Save (perform_validation = true),如果perform_validation为false,它将绕过(跳过将是正确的词)与Save相关的所有验证。
第二个问题
另外,将哈希传递给update_attributes的正确语法是什么…请查看顶部的示例。
你的例子是正确的。
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
or
Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"
或者如果你在哈希中获得所有字段数据和名称,在这里使用params[:user]
Object.update_attributes(params[:user])
请参考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(true)。
抱歉描述太长了,但我想说的是重要的。Save (perform_validation = true),如果perform_validation为false,它将绕过(跳过将是正确的词)与Save相关的所有验证。
第二个问题
另外,将哈希传递给update_attributes的正确语法是什么…请查看顶部的示例。
你的例子是正确的。
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
or
Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"
或者如果你在哈希中获得所有字段数据和名称,在这里使用params[:user]
Object.update_attributes(params[:user])
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)
希望这个答案能帮你理清什么时候用什么方法主动备案。
Update_attribute和update_attributes类似,但是
有一个很大的区别:update_attribute不运行验证。
另外:
Update_attribute用于更新单属性记录。
模型。update_attribute (column_name, column_value1)
Update_attributes用于更新具有多个属性的记录。
模型。Update_attributes (:column_name1 => column_value1,:column_name2 => column_value2,…)
这两种方法很容易混淆,因为它们的名称和工作原理相似。因此,update_attribute被移除,取而代之的是update_column。
现在,在Rails4中您可以使用Model。update_column(:column_name, column_value)在Model所在的位置。update_attribute (column_name, column_value)
点击这里获取关于update_column的更多信息。