Ruby on rails 确保Rails中模型的每个实例在内存中最多存在一次

Ruby on rails 确保Rails中模型的每个实例在内存中最多存在一次,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,假设我在ActiveRecord模型中有一个User类,当用户登录时,我将用户对象存储在会话中。(即,会话[:用户]=用户) 在我的代码中的某个时刻,我可能会从数据库中加载相同的用户并对其进行更新 user = User.where(happy: false).first user.happy = true user.save 但是会话中的用户不是最新的,因为session[:user]是对内存中另一个用户实例的引用 如果ActiveRecord查询方法尽可能从内存中加载User的实例(可能使

假设我在ActiveRecord模型中有一个
User
类,当用户登录时,我将用户对象存储在会话中。(即,
会话[:用户]=用户

在我的代码中的某个时刻,我可能会从数据库中加载相同的用户并对其进行更新

user = User.where(happy: false).first
user.happy = true
user.save
但是会话中的用户不是最新的,因为
session[:user]
是对内存中另一个用户实例的引用

如果ActiveRecord查询方法尽可能从内存中加载
User
的实例(可能使用ObjectSpace),这将解决问题,但为了避免问题,有什么更好的方法解决此问题?
当每个控制器运行时,重复刷新会话中每个对象的最佳方法是什么?我是否应该避免将对象存储在会话中而使用对象ID?

将对象存储在会话存储中是一个很好的选择


因此,您对存储ID的猜测是正确的,这是正确的方法

过去,ActiveRecord有一个可选的标识映射,但是。我建议不要使用这样的会话,如果您需要某个用户,请将其传递到调用链,或者尝试确保该用户仅在尽可能小的范围内使用。您的意思是建议在需要时从数据库加载该用户(例如,通过将其id存储在会话中)而不是直接存储对象?或者在控制器中使用通常的
当前用户
方法。然后,如果您怀疑有人在背后更改了底层用户,请手动
reload
it。我只把ID放在任何持久性的东西中,并尽可能避免隐藏全局变量(这就是
会话
甚至
当前用户
的真正含义)。