[英]Avoid current_user hitting db every time? Ruby on Rails
我正在關注Ruby on Rails教程 。 給出了密碼,
在會話助手中:
def sign_in(user)
remember_token= User.new_remember_token
cookies.permanent[:remember_token]=remember_token #save the unencrypted token to browser cookies
user.update_attribute(:remember_token, User.encrypt(remember_token))
self.current_user= user
end
def current_user=(user)
@current_user= user
end
def current_user
encrypted_token=User.encrypt(cookies[:remember_token])
@current_user ||=User.find_by(remember_token:encrypted_token)
end
def sign_in?
!current_user.nil?
end
在導航器視圖中:
<% if sign_in? %>
<li><%= link_to "Profile",current_user %></li>
<% end %>
我的問題是:
sign_in?
來減少數據庫命中率sign_in?
作用於: def sign_in? if @current_user.nil? !current_user.nil? else false end end
3.解決此問題的最佳實踐是什么?
提前致謝。
我認為您的解決方案很好,不需要修復。
我確實有兩個建議/替代方法供您參考,如果您對當前的狀況不滿意,則可能要探索( 但是我不建議在您的解決方案中使用這些方法,我只想舉例說明替代方法 ):
沒有解決方案”。
HTTP服務器是無狀態的。 每個請求都是新的。 實例變量僅存在於每個請求中,這意味着在下一個請求中該變量將不存在。
記住此用戶“狀態”的唯一方法是將某些數據保存到db,並在每次他請求時對其進行身份驗證。
不用擔心數據庫,它們被設計為可以運行:)
如果記錄加載很簡單,則可以使用二級緩存來保存數據庫請求。 但是,由於您使用某種密鑰來查找用戶,因此將無法使用。
但是,每次都可以從數據庫加載用戶。 這是Rails項目中的常見做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.