2017-01-18 8 views
0

私はactiverecord-session_store gemを使ってデータベースにセッションを保存しています。現在のユーザーのセッションを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 

をしてpostgresのに対してjsonフィールドを照会。

ActionDispatch::Session::ActiveRecordStore.session_class = MySessionClass 

と明示的にテーブルの各列にuser_idを保存し、pre_commitフックを実装する:あなたはMySQLを使用している場合


することは、あなた自身のセッションクラスを実装することができます。その後、この列に対してクエリを実行します。

1

私が間違っていない場合は、同じ電話番号current_userをコントローラに使用できます。だからあなたのようなcurrent_user.id

何かに対してフィルタリングするために同じコードを使用することができ、そのコントローラ/ルート上のセットアップbefore_filter場合:

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 
関連する問題