据我所知,无论选择哪种会话存储,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 都是安全的,那么问题出在哪里?
可能我错过了一些东西。
有人可以说清楚吗?
谢谢