簡體   English   中英

避免current_user每次都訪問數據庫? Ruby on Rails

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

我的問題是:

  1. 訪客每次刷新導航器時,它是否都會訪問數據庫?
  2. 我可以通過在視圖中使用@current_user並更改sign_in?來減少數據庫命中率sign_in? 作用於:
 def sign_in? if @current_user.nil? !current_user.nil? else false end end 

3.解決此問題的最佳實踐是什么?

提前致謝。

我認為您的解決方案很好,不需要修復。

我確實有兩個建議/替代方法供您參考,如果您對當前的狀況不滿意,則可能要探索( 但是我不建議在您的解決方案中使用這些方法,我只想舉例說明替代方法 ):

  1. 使用會話而不是數據庫 HTTP是無狀態的。 但是,發明了會話以使http變為全狀態。 您可以使用會話,並在其中存儲對currentuser的引用。 然后,您可以檢查會話中是否存在user_id,而不必每次都訪問數據庫。 當然,這會降低您的安全性。 這是否應為您所接受,取決於您應用程序的性質。
  2. 僅在訪問級別更改時檢查憑據 這是一種對用戶授權更為實用/寬松的方法。 如果您認為這種情況下的安全性下降是否可以接受,則取決於您 它的工作方式如下:例如,我們有一個帶有頁面的簡單網站。 最低的訪問級別是讀取級別,如果用戶決定編輯頁面,則他將進入寫入級別。 在這種方法中,訪問級別的更改將在您再次進行完整的身份驗證檢查時進行。 因此,並非每次都如此,僅當您更改訪問級別時,才對用戶進行重新認證和重新授權。 也許您還想隨機確定是否要進行重新認證/重新授權,這避免了可預測性。

沒有解決方案”。

HTTP服務器是無狀態的。 每個請求都是新的。 實例變量僅存在於每個請求中,這意味着在下一個請求中該變量將不存在。

記住此用戶“狀態”的唯一方法是將某些數據保存到db,並在每次他請求時對其進行身份驗證。

不用擔心數據庫,它們被設計為可以運行:)

如果記錄加載很簡單,則可以使用二級緩存來保存數據庫請求。 但是,由於您使用某種密鑰來查找用戶,因此將無法使用。

但是,每次都可以從數據庫加載用戶。 這是Rails項目中的常見做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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