Tuesday, October 23, 2007

Determine which user is online and active in the last 30 minutes

This is what I did to determine how many users and which user is online and active in the last 30 minutes from Rails. I went through http://groups.google.com/group/rubyonrails-talk to find out how other people dealt with this issue. Most people deal with this through session with active_record_store. I think this way is quite reasonable because each time the user request to our pages, it will create a new record or update the existing record. This would allow me and other people interferes to determine which user is online.

To configure to use active_record_store with session, go to see Agile Web Development with Rails 2nd edition on page 99.

Some people are likely to interfere by adding the user_id and host column in the table sessions. They use before_filter on the application controller. If they found the session_id in the table is the same as session.session_id, they update the column user_id with session[:user_id]. To access to the sessions table, it must use this syntax CGI::Session::ActiveRecordStore::Session. I try with this syntax but could not update my fields anyway. It is difficult to interfere with code the rails creator use to write a record to the sessions table. It is not the normal active record model that I expected. So, I come up with another solution by creating a new model called Session that maps it to the sessions table. This way I could update the record in the table. But I still face with another problem. I need to write to the table whenever the user first request to my page with the new column "host" that record ip address. I don't know how to interfere with this.

Therefore, I find another solution that seems to be not so good, but reasonable. I create a new table that map to the sessions table called active_users that has the following fields: id, session_id, user_id, host, url, created_at, updated_at. I use after_filter on the application controller to update or create a new record in this table by looking into the session_id in the table first. If it is already exists, I just update the host, user_id, and url. Otherwise, I create a new row in this table. I also create a trigger on the sessions table. When the user deletes the records, it also deletes record in active_users also. I think I should need a cron job that removes all unnecessary session records every 1 hour. Oh, there is still another problem, when the user log out, don't forget to delete records in active_users table. There is no need for the sessions table because it will be done automatically. And, that's it. I create two methods in the User model.

def self.total_online
sql = "Select Count(Distinct user_id) as total " +
"From active_users " +
"Where updated_at > ?"
ActiveUser.find_by_sql([sql, 30.minutes.ago])[0].total.to_i
end

def self.online?(user_id)
sql = "Select * from active_users " +
"Where user_id = ? " +
"And updated_at > ?"
ActiveUser.find_by_sql([sql, user_id, 30.minutes.ago]).length >= 1
end

1 comment:

Anonymous said...

http://www.gryziko.pl Zobacz wlasne mapy w rozrywkach przez internet, ze grasz. Uchwycenie obszar wydaje sie byc nadzwyczaj wazne zwyciestwo. Gdzie istnieja najlepsze obszaru, sposród którego sie zamaskowac i zasadzki przeciwników? Gdzie mozna zrobic skróty do daja solidniejsze sytuacje strategiczna? Tenze typ wiedzy daje wazna dominacje strategiczna. Nie doceniac taktyke tlumienia plomienia w trybie przez internet shooter. Jesli grasz na zespoly, majac poszczególnego zawodnika wylacznie zawierajace teren sposród zywym pozarem jego koledzy sposród ekipy przynosi wielka szanse podkrasc sie do nieprzyjaciela albo przynajmniej dobrze sytuacje strategiczna. Pracujac razem, jak to rzeczywiscie ma mozliwosc podwyzszyc swoje wygrane. Jesli grasz przy rozrywki sportowe, natomiast nie zaakceptowac masz jakiegokolwiek badz doswiadczen z nim, ulokowac pulap trudnosci dzieki debiutanta. To pomoze Ci wybrac sie na unikatowych cech gry i nauczyc sie przemieszczac w polu. Jesli zostanie ustawiona powyzej niz, ze wydaje sie byc mozliwe, aby niepokoic i nie ma nawet najmniejszej rozrywki. Rób pospolite spacji, gdy grasz rozrywki internetowego, ze nie mozna wydobyc sie na osobnosci od momentu. Rzeczywiscie wolno sie uzaleznic od gier w niezdrowy sposób, jezeli nie chód czasami. Cwiczenie zabawy oraz projekcja go powinna byc zabawa. Jezeli podejrzewasz, iz jestes podporzadkowany od funkcjonowania, natomiast to utrzymuje dzieki swoje zycie, nalezy porozmawiac z doktorem na temat tym. Jesli grasz shooter, zeby wielu z Twoich zdjec rzeczywiscie liczyc. Mnóstwo graczy mlodych zrobic blad jedynie sciskajac za spust oraz wypuszczano runde wedlug rundzie. Wkrótce mozesz pusty oraz nic nie pokazuje na owo. Zamiast oczekiwac w czysty strzal i wytrwalosci dzialalnosci powszechnej. Bedziesz nagrodzony. Gdy nabyc uzywane gry [url=http://www.gryziko.pl]gry[/url] online, powinno sie w kazdej sytuacji zbadac plyte poprzednio sprzedaja gryzie do Ciebie. Dojazd do odwiedzenia budynku, by dowiedziec sie, iz uciecha jest porysowana oraz nie dziala jest bolesc. Bedziesz ronic okresu i gaz wraca do odwiedzenia sklepu. Oraz, mozna wylacznie byc w stanie powrócic kredytowej sklepiku oraz jest to moze byc wylaczny egzemplarz posiadali. Upewnij sie, ze zdobycie porzadnej kopii. Luksus wydaje sie byc kluczem. Zero nie zaakceptowac szkodzi sesje gry maraton szybciej niz ciasnym reka. Pare dodatkowych dolarów zakupic wygodne myszy (lub rewizor, jesli uciecha na konsoli) beda warte inwestycji. Sporo sklepów posiada jednostek demonstracyjnych, iz mozna posmakowac, wiec korzystac sposród okazji, by znalezc myszy albo kontrolera, który ustala sie do odwiedzenia dloni idealnie. Znajdz najlepsza oferte na rzecz gier online poprzez sieciowe wyszukiwarki. Duzo razy, jest to najlepsze obszar, aby w zabawy online wyjawszy rozbijania agencji bankowej. Mozesz dostac gre, która jest zwyczajnie jak nowy, wyjawszy oryginalnej wartosci. Gry sa drogie, zas to perfekcyjny sposób na zaoszczedzenie kasy w nich. Jezeli czujesz, kiedy push up, nalezy faktycznie, zwazajac na dól, a w nastepnej kolejnosci sprowadzic osi w ustawieniach sterowania. Co poniektórzy ludzie zwyczajnie nie zaakceptowac odczuwam sie inspekcje osi sa poprawne, gdy przyjmuja rozrywki online. To jest latwe do odwiedzenia pielegnacji. Duzo konsol przynosi sposobnosc odwrócenia systemy kontroli przy ustawieniu obszarze. Zbyc wlasne wykorzystywane gry na zakup oryginalnych albo swiezych dla ciebie rozrywki. gry online nie zaakceptowac beda niedrogie, natomiast pewne z tych propozycji nie zaakceptowac posiadasz jakiegokolwiek badz pozytku po zwyciezyc. Lub badania oraz znalezc sklepy, które nabywaja uzywane rozrywki. Sklepy te beda lub oplacac w gotówce lub pozyczki sklepu. Owo umozliwia uzyskac gry pragniesz, nie zaakceptowac wydajac duzo gotówki.

Subscribe in a Reader