如何在一个命令中更新和保存ruby activerecord中的列



我正在这样做:

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_attributeupdate_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

最新更新