所以,为了性能,我正在使用数据库会话。我认为虽然会话是服务器端,但我也可以在会话中存储常用的对象。所以,我正在存储current_user,current_account和current_user权限的序列化版本。
用户模型有很多权限方法(比如user.can_do_whatever),但是因为我试图提高效率,并且在会话中存储常用的东西(这样可以减少数据库访问次数),是否有意义/破坏任何设计标准(在每个请求时)将会话存储在current_user中的实例变量中?
截至目前,我想不出任何其他选择。
答案 0 :(得分:3)
ROR应用程序默认具有RESTful设计。 REST的一个规则是无状态。这意味着从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。
如果您在使用数据库性能方面遇到问题,请使用memcached中已集成的rails (Caching with Rails)等缓存系统。
答案 1 :(得分:1)
我发现couple references警告不要在会话中存储非原始数据类型,但它们都只是警告,并归结为:存储复杂对象是“特别气馁”[ sic],但如果你决定需要......好吧,请小心。
无论如何,我有点想把用户表作为会话表加倍,但序列化似乎有点粗略。如果您只是想减少数据库请求的数量,那么在查找用户时如何存储ID并使用:joins
(可能需要一些麻烦才能将其用于默认会话加载)。这避免了同步问题和序列化草图,并且仍然只生成单个数据库查询。只需确保使用:joins
而非:include
,因为后者生成a query for each table。
希望有所帮助!