ruby-on-rails - 在 Rails 的 session 中存储对象

标签 ruby-on-rails ruby session

我一直被教导说在 session 中存储对象是个坏主意。相反,应该存储 ID,以便在需要时检索记录。

但是,我想知道有一个应用程序是该规则的异常(exception)。我正在构建一个抽认卡应用程序,被测验的单词位于数据库中的一个表中,该表的架构不会改变。我想将当前正在测验的单词存储在一个 session 中,这样用户就可以在他们开始的地方完成,以防他们转到一个单独的页面。

在这种情况下,是否可以将这些单词作为对象存储在数据库中?如果是这样,为什么?我问的原因是因为测验旨在快速进行,我不想浪费数据库调用来检索一开始就永远不会改变的记录。然而,也许还有其他我不知道的大型 session 的负面影响。

*郑重声明,我曾尝试使用 Rails 2.3 中的内置内存缓存方法对其进行缓存,但显然每个项目的最大大小为 1MB。

最佳答案

不在session中存储对象的主要原因是,如果对象结构改变,你会得到一个异常。请考虑以下事项:

class Foo
  attr_accessor :bar
end

class Bar
end

foo = Foo.new
foo.bar = Bar.new
put_in_session(foo)

然后,在项目的后续版本中,您更改了 Bar 的名称。您重新启动服务器,并尝试从 session 中获取 foo。当它尝试反序列化时,找不到 Bar 并爆炸。

避免这个陷阱似乎很容易,但在实践中,我已经看到它咬了很多人。这只是因为序列化一个对象有时会比立即看到的花费更多的时间(这种事情应该是透明的),除非您对此有严格的规则,否则事情往往会变得困惑。

它通常不受欢迎的原因是,这在 ActiveRecord 中很常见,因为你的应用程序的结构随着时间的推移而改变是很常见的,并且 session 可以在最初的一周或更长时间后反序列化已创建。

如果您了解所有这些并且愿意投入精力以确保您的模型不会更改并且不会序列化任何额外的内容,那么您可能没问题。但要小心:)

关于ruby-on-rails - 在 Rails 的 session 中存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1095714/

相关文章:

ruby-on-rails - Heroku Postgres Dump 不创建序列

ruby - 如何在另一个 Sinatra 应用程序中安装 Sinatra 应用程序?

ruby - 在 Jekyll Liquid 中对 forloop.index 使用模数

node.js - CORS 调用后 Express session cookie 不会保留

asp.net - 在两个不同的域中维护 iframe 的 session

ruby-on-rails - Rails 应用程序中的 guest 用户功能,在 session 中设计 + 存储

ruby-on-rails - 仅针对特定代码路径调用 after_action

ruby-on-rails - rails Controller 测试,获取 ActionView::MissingTemplate: 缺少模板

ruby - 为什么在Ruby 中可以执行类内部但方法外部的行?

php - POST 表单显示错误回显