views:

348

answers:

1

We have implemented a simple chat room feature in Rails using Simple Ajax updates. Now in every chat room a message belongs to particular user. We want to show the list of users(something like user presence). Please suggest ways. We are not using Jabber,XMPP etc.

The Chatroom model is:

class ChatRoom < ActiveRecord::Base
  validates_presence_of :title

  has_many :messages,:foreign_key=> "chat_room_id"
  has_many :stories,:foreign_key=>"chat_room_id"
  has_many :topics,:foreign_key=>"chat_room_id"


end

The messages are the chats sent of every user.

The message model is:

class Message < ActiveRecord::Base
  belongs_to :user
end

The USer model is:

class User < ActiveRecord::Base
  acts_as_authentic :crypto_provider => Authlogic::CryptoProviders::BCrypt
  validates_presence_of :nick
  validates_uniqueness_of :nick
  has_many :questions
  end

Please suggest ways

+5  A: 

To keep track of which users are in which room, you could set up a HABTM relationship between the ChatRoom and User models. And, you could add a last_poll_datetime column to the User model to track the last time the user polled for messages (more on this part in a minute).

To show a list of all the users in a given room, use your HABTM join table, ChatRooms_Users. You'll be inserting/deleting from this table whenever a user joins or leaves a room.

If you want to expire users who close their browsers instead of clicking 'leave room', set up a sweeper task to run every minute that looks for users with last_poll_datetime older than one minute and remove their rows from the ChatRooms_Users join table.

Gabe Hollombe
0 Gabe, you just answered another a question I had: how to make stray users inactive.I think your approach is great. Thanks so much!
Tricon
+1 Nice answer - very complete.
Mark Brittingham
Thanks @Tricon and @Mark. =-)
Gabe Hollombe