[英]Should each request cost 2 database hits when using Devise+CanCan+Rolify?
據我了解,無論選擇哪個會話存儲,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?
helper方法始終向數據庫發送調用。
為什么不僅僅檢查session
對象是否存在? 用戶登錄后,可以將User
對象的所需屬性存儲在session
,是否不需要在每次請求頁面時都訪問數據庫? 所有的cookie都可以在Rails 4中安全使用,那是什么問題?
可能我缺少了一些東西。
有人可以說清楚嗎?
謝謝
josevalim的答案如下 :
“ 如果我沒記錯的話,user_signed_in?helper方法總是向數據庫發送調用。 ”
它發送一個呼叫,然后將其緩存。 我們需要加載會話並嘗試加載用戶,因為該用戶可能已從數據庫中刪除。 否則,用戶訪問應用程序的時間可能已到期,依此類推。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.