Присутствие пользователя в чате (обновление чата простым опросом)

Мы реализовали функцию простого чата в Rails, используя обновления Simple Ajax. Теперь в каждом чате сообщение принадлежит конкретному пользователю. Мы хотим показать список пользователей (что-то вроде присутствия пользователя). Пожалуйста, предложите способы. Мы не используем Jabber, XMPP и т. д.

Модель чата:

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

Сообщения — это чаты, отправленные каждым пользователем.

Модель сообщения:

class Message < ActiveRecord::Base
  belongs_to :user
end

Модель пользователя:

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

Пожалуйста, предложите способы


person Arc    schedule 01.04.2009    source источник


Ответы (1)


Чтобы отслеживать, какие пользователи находятся в какой комнате, вы можете установить отношение HABTM между моделями ChatRoom и User. Кроме того, вы можете добавить столбец last_poll_datetime в модель User, чтобы отслеживать последний раз, когда пользователь опрашивал сообщения (подробнее об этом чуть позже).

Чтобы отобразить список всех пользователей в данной комнате, используйте таблицу соединений HABTM, ChatRooms_Users. Вы будете вставлять/удалять из этой таблицы всякий раз, когда пользователь присоединяется к комнате или покидает ее.

Если вы хотите удалить пользователей, которые закрывают свои браузеры вместо того, чтобы нажимать «выйти из комнаты», настройте задачу очистки для запуска каждую минуту, которая ищет пользователей с last_poll_datetime старше одной минуты и удаляет их строки из таблицы соединения ChatRooms_Users.

person Gabe Hollombe    schedule 01.04.2009
comment
0 Гейб, ты только что ответил на очередной мой вопрос: как сделать бродячих пользователей неактивными. Я думаю, что ваш подход великолепен. Большое спасибо! - person ; 27.06.2009