Я только что реализовал другую версию этого и подумал, что поделюсь, если это кому-нибудь поможет.
Я просто добавляю столбец last_sign_out_at
в свою таблицу Users, а затем делаю на подклассы контроллер сессий Deviseпоэтому я мог переопределить метод destroy, чтобы установить его при уничтожении сеанса (пользователь выходит):
# app/controllers
class SessionsController < Devise::SessionsController
def destroy
current_user.update_attribute(:last_sign_out_at, Time.now)
super
end
end
А затем в моей модели User у меня есть метод проверки, если пользователь находится в сети:
class User < ActiveRecord::Base
def online?
if current_sign_in_at.present?
last_sign_out_at.present? ? current_sign_in_at > last_sign_out_at : true
else
false
end
end
end
Также вы должны указать Devise использовать новый контроллер Sessions в ваших маршрутах.