2011-07-29 20 views
1

看来,当Devise登录用户时,只有用户标识存储在会话中。 这意味着只要调用current_user就会导致SQL查询(类似于User.find(:id))来创建User对象,这在很多情况下是不必要的负载。
例如,我们可能希望在右上角的标题中显示用户名,该标题位于布局文件中,并在每个响应中呈现。为此,我们可能只写current_user.name,这会导致对用户表的SQL查询。如何自定义设计以在会话中存储更多信息?

我真的想在会话中存储当前用户的一些基本信息(例如姓名和电子邮件地址),以避免额外的SQL查询。

这个问题的正确解决方案是什么?

回答

2

已经忘记它了。该SQL查询实际上是免费的。如果你真的从User.find(id)看到性能问题,那么你的应用程序/数据库/服务器完全拧紧。

此外,通过在会话中存储更多数据,可以显示不再显示当前数据的可能性。你是否允许用户编辑他们的信息 - 如果是的话,当他们编辑他们的名字时会发生什么?这是没有真正的回报的麻烦。

+0

你为什么说“那SQL查询是有效的免费的”?我认为这确实是一个应该避免的额外查询。并且当用户更新他的名字时,我们只需要更新会话。 – Tao

+0

该查询使用主键查找记录,因此数据库将以极快的速度返回该记录。接下来,ActiveRecord将实例化记录对象,但单个AR记录再次构建起来非常快。规则#1:优化前后的配置文件。这对我来说听起来像是不经意的过早优化。如果添加此用户检索会导致页面构建时间发生重大变化,则a)您的应用程序对数据库没有做其他任何操作,或者b)您的数据库表/索引已搞乱并需要修复或重新调整。 –

+0

好吧,谢谢〜 – Tao

相关问题