使用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
正在更新与我要求的属性不同的属性。
为什么?我该如何解决这个问题?
答案 0 :(得分:4)
Rails中有两种相关方法:update_attribute
和update_column
。
update_attribute
,它的作用是设置属性的值,和
然后调用对象的完整保存而不进行验证(但调用回调)。这将导致其他不相关的字段
已更新以保存(在这种情况下为name
字段)
update_column
将直接更新数据库中的该字段,而忽略任何其他更改
到任何其他字段,并忽略验证和回调。
如果你想要的是更新字段以确保没有其他人更新,跳过所有可能的副作用,最好的选择是使用update_column
。相反,如果你想更新一个跳过验证的字段,我会说你最好更新属性并调用save(validate: false)
,所以你的意图是明确的。