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

时间:2014-06-12 12:37:48

标签: ruby activerecord

我这样做:

work_status.progress = 90
work_status.save!

我想这样做:

work_status.progress.set! 90

你知道如何优雅地做到这一点吗?

2 个答案:

答案 0 :(得分:4)

就这样做

work_status.update_attribute(progress: 90)

update_attribute

  

更新单个属性并保存记录,而无需通过正常的验证程序。

如果您想在更新时执行验证,请改用#update_attributes

你也可以这样做: -

 work_status.update(progress: 90)

update

  

从传入的哈希中更新模型的属性并保存记录,所有记录都包含在事务中。 如果对象无效,则保存将失败并返回false。

答案 1 :(得分:3)

有两种方法可以执行此操作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)

这也将保存电子邮件属性,即使它无效(因为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