當用戶登錄時,我將數據庫中的用戶ID保存到session[:user_id]
。我應該怎麼做才能找出登錄用戶的數量?Rails:如何在我的Rails應用程序中找到登錄的用戶?
我使用ActionDispatch::Session::CacheStore
進行會話存儲。
請指導我實現目標的正確方法。
當用戶登錄時,我將數據庫中的用戶ID保存到session[:user_id]
。我應該怎麼做才能找出登錄用戶的數量?Rails:如何在我的Rails應用程序中找到登錄的用戶?
我使用ActionDispatch::Session::CacheStore
進行會話存儲。
請指導我實現目標的正確方法。
可能最好的解決方案是切換到使用Active Record Session存儲。這很容易做到 - 您只需添加(並運行)遷移即可創建會話表。只要運行:
rake db:sessions:create
那麼會話存儲配置添加到:config/initializers/session_store.rb
像這樣:
YourApplication::Application.config.session_store :active_record_store
一旦你做到了這一點,並重新啓動您的服務器的Rails現在將在數據庫中存儲您的會話。
這樣你就可以得到在使用類似的用戶登錄的當前數量:
ActiveRecord::SessionStore::Session.count
雖然會更準確只計算那些最近更新 - 說的最後5分鐘:
ActiveRecord::SessionStore::Session.where("updated_at > ?", 5.minutes.ago).count
根據您需要多長時間查詢你可能要考慮的緩存值或遞增/在後創建或滅絕之後,回調遞減緩存值,但似乎有點小題大做此值。
當一個會話被創建或銷燬時,你可以嘗試實現一個增量或減量的會話變量,並使用一些助手來遞增/遞減計數器。
def sessions_increment
if session[:count].nil?
session[:count] = 0
end
session[:count] += 1
end
def sessions_decrement
if session[:count].nil?
session[:count] = 0
end
session[:count] -= 1
end
感謝您的回答。這種方法對PostgreSQL的高負載應用程序有效嗎?沒有額外的查詢找到解決方案將是很酷的。 – user1538633
我會先嚐試這種技術,這是一個簡單的查詢,遷移自動將一個索引添加到updated_at列。如果您發現導致性能問題,您可以考慮使用類似的方法,但是可以使用mem_cache_store,也可以簡單地緩存數據庫查詢的結果。 – stuartbates