Oft will man auf seiner Website anzeigen, welche Mitglieder gerade online sind. Courtenay beschreibt einen Lösungsweg in seinem Blog. Hier nochmal etwas aktueller und auf Deutsch.
Umstellen auf Datenbank-Sessions
Falls noch nicht geschehen, muss der SessionStore umgestellt werden, so dass die Sessions in der Datenbank gespeichert werden anstatt im Dateisystem. Zuerst erstellen wir die nötige Session-Tabelle mit:
rake create_sessions_table
Anschließend müssen wir dem ActionController noch mitteilen, dass wir den ActiveRecordStore für unsere Sessions nutzen wollen. Dazu editieren wir config/environment.rb und Ändern oder Ergänzen diese Zeile:
config.action_controller.session_store = :active_record_store
Erstellen des Models
Jetzt brauchen wir noch ein Model, damit wir auch auf die Sessions zugreifen können. Ich habe es der Einfachheit halber Session genannt: script/generate model session
Wir editieren dieses Model anschließend gleich, und tragen die Assoziation zur Benutzer-Tabelle ein: class Session < ActiveRecord::Base
belongs_to :user
end
Session-Tabelle modifizieren
Die Session-Tabelle benötigt nun noch ein Feld, in dem wir die Id des Benutzers speichern können. Dazu erstellen wir eine Migration: script/generate migration add_user_to_sessions
In diese Migration fügen wir folgendes ein: add_column :sessions, :user_id, :integer
Die UserId setzen
Wenn sich ein Benutzer einloggt, müssen wir seine UserId setzen. Der ActiveRecordStore für Sessions erlaubt einen Zugriff auf die genutzte Tabelle über @session.model: @session.model.user_id = @session[:user_id]
Anzeigen, wer online ist
@users_online = Session.find(:all, :conditions => ['sessions.updated_at > ? AND NOT ISNULL(sessions.user_id)', Time.now - 5.minutes], :include => :user)
Wer meinen Artikel “Who is online?” mit RubyOnRails gelesen hat und das ganze gleich selbst ausprobieren wollte, stand vor einem Problem: Tests.
Viele Leute haben mir gesagt, die UserId in der Session-Tabelle zu speichern wäre der falsche Ansatz. Unsauber, nicht den Normalformen entsprechend, usw. Sie empfehlen ein Feld is_online zur Tabelle users hinzuzufügen. Ich bin anderer Meinung.Abgelaufen