【发布时间】:2011-02-16 05:41:10
【问题描述】:
obj.update_attribute(:only_one_field, 'Some Value')
obj.update_attributes(field1: 'value', field2: 'value2', field3: 'value3')
这两种方法都会更新对象,而无需明确告诉 ActiveRecord 进行更新。
Rails API 说:
更新属性
更新单个属性并保存记录,而不经过正常的验证过程。这对于现有记录上的布尔标志特别有用。当混入验证模块时,Base 中的常规 update_attribute 方法被替换为 this,默认情况下。
更新属性
从传入的 Hash 中更新所有属性并保存记录。如果对象无效,则保存失败,返回false。
所以如果我不想验证对象,我应该使用#update_attribute。如果我在#before_save 上有这个更新,它会溢出吗?
我的问题是#update_attribute 是否也绕过了之前的保存或只是验证。
另外,将哈希传递给#update_attributes 的正确语法是什么...查看顶部的示例。
【问题讨论】:
-
为什么要将
update_attribute语句放在before_save回调中?我想不出一个很好的理由。 -
我有需要根据更新对象的数量进行更新的对象。有什么更好的方法?
-
我是对的,您需要更新的对象是您正在保存的对象的属性吗?如果是,那么您可以设置它们,它们将与无论如何保存的对象一起更新(因为它们是在
before_save回调中设置的)。 F.e.而不是update_attribute(:discount, 0.1) if amount > 100,你可以做discount = 0.1 if amount > 100。update_attribute在对象上调用save,在这种情况下这是不必要的,因为该语句在before_save回调中并且无论如何都会被保存。我希望这是有道理的。 -
是和不是。但是,您所指的对象的状态取决于保存前无法处理的其他条件。
-
请注意,这些方法会跳过验证,但会仍然执行回调,例如 after_save ...
标签: ruby-on-rails callback update-attributes