`update_attribute`更新不同于指定的属性

时间:2014-01-05 10:38:02

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

使用update_attribute时遇到问题。我只希望更新我指定的属性,但是不同的属性(在我无法访问的不同位置更改的属性)。

这是一个简化版本:

user = User.find(1)
p user.attributes #=> name: 'something', email: nil
user.name = 'test'
user.update_attribute :email, 'test@test.com'

如果我查看对象后,我会

user2 = User.find(1)
p user2.attributes #=> name: 'test', email: 'test@test.com'

因此,update_attribute正在更新与我要求的属性不同的属性。 为什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

Rails中有两种相关方法:update_attributeupdate_column

update_attribute,它的作用是设置属性的值,和 然后调用对象的完整保存而不进行验证(但调用回调)。这将导致其他不相关的字段 已更新以保存(在这种情况下为name字段)

相反,

update_column将直接更新数据库中的该字段,而忽略任何其他更改 到任何其他字段,并忽略验证和回调。

如果你想要的是更新字段以确保没有其他人更新,跳过所有可能的副作用,最好的选择是使用update_column。相反,如果你想更新一个跳过验证的字段,我会说你最好更新属性并调用save(validate: false),所以你的意图是明确的。