我一直被教导在会话中存储对象是一个坏主意。相反,应该存储 ID,以便在需要时检索记录。
但是,我有一个应用程序,我想知道它是否是该规则的例外。我正在构建一个抽认卡应用程序,被测验的单词位于数据库中的一个表中,其架构不会更改。我想存储当前在会话中测验的单词,以便用户可以从开始的地方完成,以防他们转到单独的页面。
在这种情况下,是否可以将这些单词作为对象存储在数据库中?如果是这样,为什么?我之所以问这个问题,是因为测验的设计目的是快速进行,我不想浪费数据库调用来检索一开始就不会改变的记录。然而,也许大型会议还有其他我不知道的负面影响。
*郑重声明,我尝试使用 Rails 2.3 中的内置 memcache 方法对其进行缓存,但显然每个项目的最大大小为 1MB。
不在会话中存储对象的主要原因是,如果对象结构发生更改,则会出现异常。考虑以下:
class Foo
attr_accessor :bar
end
class Bar
end
foo = Foo.new
foo.bar = Bar.new
put_in_session(foo)
然后,在项目的后续版本中,您更改 Bar 的名称。您重新启动服务器,并尝试从会话中获取 foo。当它尝试反序列化时,它找不到 Bar 并爆炸。
似乎很容易避免这个陷阱,但在实践中,我已经看到它咬伤了很多人。这只是因为序列化对象有时可能需要比立即显而易见的更多的时间(这种事情应该是透明的),除非您对此有严格的规则,否则事情往往会变得混乱。
它通常不受欢迎的原因是,在 ActiveRecord 中这种情况非常常见,因为应用程序的结构随着时间的推移而变化是很常见的,并且会话可以在最初创建后一周或更长时间进行反序列化。
如果您了解所有这些,并且愿意投入精力来确保您的模型不会更改并且不会序列化任何额外的内容,那么您可能没问题。不过要小心 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)