2017-01-18 76 views
0

列表會話我使用activerecord-session_store寶石存儲在數據庫中的會話。當前用戶只用Rails

我列出會議在我SessionsController這個方法:

def index 
    @sessions = Session.all 
end 

然而,這列出了當前登錄的用戶在應用程序中的所有會話,而不僅僅是那些。會話的數據庫表具有以下列:id, session_id, data, created_at, updated_at因此沒有user_id列進行過濾。

我可以Marshal.load(Base64.decode64(session.data))['user_id']

如何使用這些數據來過濾列表訪問會話數據的user_id?到目前爲止,所有我能想到的是做一個條件以比較其對current_user.id

例如查看

<% @sessions.each do |session| %> 
    <% if Marshal.load(Base64.decode64(session.data))['user_id'] == current_user.id %> 
    <!-- LIST SESSION --> 
    <% end %> 
<% end %> 

回答

1

如果使用PostgreSQL作爲後端,你可以簡單地設置一個系列化to be :json

ActiveRecord::SessionStore::Session.serializer = :json 

和查詢json方面對Postgres的。


如果使用MySQL,你可以實現自己的會話類:

ActionDispatch::Session::ActiveRecordStore.session_class = MySessionClass 

和實施pre_commit鉤,節省相應列的user_id在表格明確。之後只需查詢此列。

1

如果我沒有記錯,您可以使用相同的呼叫current_user控制器;所以,如果你設置的是控制器/路線上before_filter您可以使用相同的代碼過濾對current_user.id

喜歡的東西:

before_filter :get_user_session 

def get_user_session 
    Session.all.each do |session| 
    if Marshal.load(Base64.decode64(session.data))['user_id'] == current_user.id 
     # do things 
    end 
    end 
end