我这样做:
work_status.progress = 90
work_status.save!
我想这样做:
work_status.progress.set! 90
你知道如何优雅地做到这一点吗?
答案 0 :(得分:4)
就这样做
work_status.update_attribute(progress: 90)
更新单个属性并保存记录,而无需通过正常的验证程序。
如果您想在更新时执行验证,请改用#update_attributes
。
你也可以这样做: -
work_status.update(progress: 90)
从传入的哈希中更新模型的属性并保存记录,所有记录都包含在事务中。 如果对象无效,则保存将失败并返回false。
答案 1 :(得分:3)
有两种方法可以执行此操作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)
这也将保存电子邮件属性,即使它无效(因为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