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只是简单地更新模型的一个属性,但是我们可以在update_attributes方法中传递多个属性。

例子:

user = User.last

#update_attribute
user.update_attribute(:status, "active")

它通过了验证

#update_attributes
user.update_attributes(first_name: 'update name', status: "active")

如果验证失败,它不会更新。

其他回答

提示:update_attribute在Rails 4通过Commit a7f4b0a1被弃用。它删除了update_attribute,改为update_column。

同样值得注意的是,使用update_attribute,需要更新的属性不需要用attr_accessible作为白名单来更新,这与质量分配方法update_attributes相反,后者只更新attr_accessible指定的属性。

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的更多信息。

最近我遇到了update_attribute vs. update_attributes和验证问题,如此相似的名称,如此不同的行为,如此令人困惑。

为了将哈希传递给update_attribute并绕过验证,你可以这样做:

object = Object.new
object.attributes = {
  field1: 'value',
  field2: 'value2',
  field3: 'value3'
}
object.save!(validate: false)

我认为你的问题是,如果在before_save中有一个update_attribute将导致无休止的循环(在before_save回调中调用update_attribute,最初由update_attribute调用触发)

我很确定它确实绕过了before_save回调,因为它实际上并不保存记录。还可以在不触发验证的情况下保存记录

模型。保存错误