簡體   English   中英

使用Devise + CanCan + Rolify時,每個請求應該花費2個數據庫命中嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM