Несмотря на то, что has_and_belongs_to_many
здесь подходит, я рекомендую вместо has_many :through
.
По сути, у вас будет явная модель соединения, которую вы можете назвать чем-то вроде ChatSession
.
class Chat < ActiveRecord::Base
has_many :chat_sessions
has_many :users, :through => :chat_sessions
end
class User < ActiveRecord::Base
has_many :chat_sessions
has_many :chats, :through => :chat_sessions
end
class ChatSession < ActiveRecord::Base
belongs_to :user
belongs_to :chat
end
Теперь вам понадобится таблица с именем chat_sessions
со столбцами: user_id и: chat_id. Это ваш стол для присоединения.
Преимущества
Вы получаете модель, которая полностью находится под вашим контролем, а не просто тупая таблица соединений, управляемая рельсами. Например, если вы хотите отслеживать количество сообщений, оставленных конкретным пользователем в конкретном чате, это может быть столбец в таблице chat_sessions
. Наличие :through
делает habtm
ненужным в большинстве случаев. Сложностей тоже нет.