将活动记录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
答案 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
时,先前设置的值将不会保留,并且再次执行查找查询。
在将结果分配给变量时,可以修改变量值并保存它,然后更新活动记录。