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

StackOverflow https://stackoverflow.com/questions/705241

Вопрос

Мы реализовали простую функцию чата в 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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top