为什么不能直接更新Active Record查找的结果?

时间:2019-03-13 18:25:46

标签: ruby-on-rails activerecord

将活动记录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

2 个答案:

答案 0 :(得分:2)

每次执行find时,都会根据User表中的当前值获取users的新实例。因此,当您User.find(1790).save时,User实例将不再具有.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

答案 1 :(得分:0)

User.find(1790)-从方法名称可以清楚地看出它是finds record matching given conditions。这将运行查询并每次都获取记录。因此,仅在该语句中设置该值不会反映为set locally。 当您再次调用User.find(1790).save时,先前设置的值将不会保留,并且再次执行查找查询。

在将结果分配给变量时,可以修改变量值并保存它,然后更新活动记录。