0

据我所知,无论选择哪种会话存储,Rails 应用程序都会为 Devise 发送一个数据库查询,为 Rolify 发送一个数据库查询。

这是我的相关代码:

<% if !user_signed_in? %>
 ..login  buttons...
<% else %>
<% unless current_user.has_role? :pro %>
 <%= link_to "Upgrade!", '#' %> |
<% end %>
  <%= link_to current_user.full_name, edit_user_registration_path %> |<%= link_to "Çıkış", destroy_user_session_path, method: :delete %>
<% end %>

正如我从开发日志中看到的那样,这些代码会导致这些 SQL 查询:

12:30:22 web.1  |   User Load (2.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 352 ORDER BY "users"."id" ASC LIMIT 1
12:30:22 web.1  |    (2.7ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'pro') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 352]]

我想知道的是,所有这些查询都是必要的吗?难道没有更好的方法来做到这一点吗?

如果我没记错user_signed_in?的话,辅助方法总是会调用数据库。

为什么它不只是检查session对象是否存在?用户登录后,User可以存储所需的对象属性,session并且每次请求页面时都不需要访问数据库?Rails 4 中的所有 cookie 都是安全的,那么问题出在哪里?

可能我错过了一些东西。

有人可以说清楚吗?

谢谢

4

1 回答 1

0

josevalim 的回答如下

如果我没记错的话,user_signed_in?helper 方法总是会调用数据库。

它发送一个调用,然后缓存它。我们需要加载会话并尝试加载用户,因为用户可能已从数据库中删除。或者用户访问应用的时间可能已经过期等等。

于 2014-04-21T11:07:26.283 回答