首页 > 解决方案 > 为什么不能直接更新 Active Record 查找的结果?

问题描述

将 Active Record 的结果find分配给变量时,更新它的结果按预期工作:

user = User.find(1790)
user.archived          # => true
user.archived = false
user.save              # => true
user.archived          # => false

为什么不能find直接更新结果?

User.find(1790).archived          # => true
User.find(1790).archived = false
User.find(1790).save              # => true
User.find(1790).archived          # => true

标签: ruby-on-railsactiverecord

解决方案


每次你这样做时find,你都会得到一个User基于users表中当前值的新实例。因此,当您 时User.find(1790).saveUser实例不再具有.archived = false,因为您刚刚从User.find具有archived = true.

尝试:

User.find(1790).archived          # => true
User.find(1790).archived = false
User.find(1790).changed?          # => false
User.find(1790).save              # => true
User.find(1790).archived          # => true

但是,看看当你这样做时会发生什么:

User.find(1790).archived                # => true
User.find(1790).update(archived: false) # => true
User.find(1790).archived                # => false

推荐阅读