2012-03-22 103 views
1

所以,为了表现,我使用数据库会话。我认为,虽然会话是服务器端,但我也可以在会话中存储常用的对象。所以,我存储了current_user,current_account和current_user权限的序列化版本。这是一个好的设计决定吗?有没有更好的办法?

用户模型掌握了很多权限方法(比如user.can_do_whatever),但是因为我试图提高效率,并且在会话中存储了常见的东西(这可以减少数据库访问) ,是否有意义/违反任何设计标准(在每次请求时)将会话存储在current_user中的实例变量中?

截至目前,我想不出任何替代品。

+0

我听说你不应该这样做(在会话中存储对象),但我不记得理由是什么(除了明显的“事情不同步”问题,这应该很容易足以应对,如果你小心)。我会看看我是否可以再次找到该引用... – 2012-03-22 19:06:23

+0

好吧,从current_user访问的东西如果它们不同步并不重要,导致我从当前用户使用的唯一属性是id ,角色和权限组。所以,如果这些事情发生了变化,要求他们重新登录是不是很好? = \ – NullVoxPopuli 2012-03-22 19:17:08

+0

也许,我可以在我的users_controller的更新方法中检查一些需要重新登录的字段,然后只更新会话数据 – NullVoxPopuli 2012-03-22 19:30:09

回答

3

ROR应用程序默认具有RESTful设计。 REST的一个规则是无状态的。这意味着客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文。

如果您在数据库性能方面遇到问题,请使用像memcached这样的缓存系统,它已被集成到rails (Caching with Rails)中。

1

我发现了一个couplereferences警告,不要在会话中存储非原始数据类型,但它们都只是警告,并且归结为:存储复杂对象是“Expecially discouraged”[原文如此],但如果您决定你需要......好,只是要小心。

无论如何,我有点认为用户表的双重作为会话表的想法,但序列化仍然似乎有点粗略。如果您只是想减少数据库请求的数量,那么存储ID和在查找用户时使用:joins(可能需要一些hackery才能使其进入默认会话加载)。这避免了同步问题和序列化概略性,并且仍然只生成一个数据库查询。只要确保使用:joins而不是:include,因为后者会生成a query for each table

希望有帮助!

+0

,这些会话不存储在users表中。有一个会议桌。虽然我会确定阅读这些参考文献。 – NullVoxPopuli 2012-03-22 19:53:42

+0

@TheLindyHop - 好的 - 很好。因为那时我想到了一些,并开始看到这种想法出现各种各样的复杂情况......我正要发布一个“但等待!”实际上编辑。干杯! – 2012-03-22 19:55:39

相关问题