2017-01-18 2 views
0

Я использую камень activerecord-session_store для хранения сеансов в базе данных.Список сеансов для текущего пользователя только в Rails

я список сессий с помощью этого метода в моем SessionsController:

def index 
    @sessions = Session.all 
end 

Однако это список всех сеансов в приложении, а не только те, в настоящее время вошел в систему. Таблица базы данных для сеансов имеет следующие столбцы: id, session_id, data, created_at, updated_at, поэтому для фильтрации не существует user_id.

я могу получить доступ к user_id в данной сессии с Marshal.load(Base64.decode64(session.data))['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 
Смежные вопросы