我正在这样做:
work_status.progress = 90
work_status.save!
,我想这样做:
work_status.progress.set! 90
你知道一种优雅的方法吗?
照做
work_status.update_attribute(progress: 90)
update_attribute
更新单个属性并保存记录,而不需要经过正常的验证过程。
如果您想在更新时执行验证,请使用#update_attributes
。
你也可以这样做:-
work_status.update(progress: 90)
update
根据传入的散列更新模型的属性并保存记录,所有这些都封装在事务中。如果对象无效,则保存失败并返回false。
update_attribute
和update_column
有两种方法。它们都有相同的签名:
work_status.update_attribute(:progress, 90)
work_status.update_column(:progress, 90)
然而,这些方法之间有一个重要的区别。 update_attribute
是邪恶的 -它保存了整个模型,而不仅仅是给定的属性,它跳过了所有的验证。想象一下下面的代码片段:
user.email = 'invalid email'
user.update_attribute(:points, 90)
这将保存一个email属性,即使它是无效的(因为update_attribute不验证模型)
相反,您应该使用update_column
,它只将单个属性保存到数据库中,其余属性保持原样:
user.email = 'invalid email'
user.update_column(:points, 90) # this updates points column in database
user.email # => 'invalid email'
user.reload.email # 'invalid email' has not been saved in database