Множественные ассоциации has_many в Rails

Допустим, у вас есть две модели, которые могут быть связаны по-разному:

Пользователь имеет много разговоров, которые он создал. (один ко многим) У пользователя много разговоров, в которых он участвует. (много ко многим)

Моей первой мыслью было сохранить идентификатор пользователя, создавшего диалог, в таблице разговоров и связать пользователей, участвующих в разговоре, в таблице соединений.

class User < ActiveRecord::Base
  has_many :conversations
  has_and_belongs_to_many :conversations
end

class Conversation < ActiveRecord::Base
  belongs_to :user
  has_and_belongs_to_many :users
end

Это, кажется, вызывает проблемы, хотя.

Какой правильный способ сделать это? По сути, я хочу иметь возможность использовать user.conversations для тех, кто участвует, и user.started_conversations для тех, кто запущен пользователем.

Благодарю.

1 ответ

Ключ не в том, чтобы использовать HABTM (где все отношения считаются простыми), а в том, чтобы использовать has_many, через, с атрибутом в соединении, чтобы указать конкретное соединение, которое обозначает инициатора / инициатора диалога.

class User < ActiveRecord::Base

  has_many :user_conversations  
  has_many :conversations, :through => :user_conversations
  has_many :initiated_conversations, :through => :user_conversations,
             :source => :conversation, 
             :conditions => ["user_conversations.starter = ?", true]

end

(при условии, что у вас есть модель соединения под названием UserConversation с логическим атрибутом под названием starter).

Это позволит вам делать такие вещи, как:

#get conversations users, including the starter
@user.conversations

#get those started by the user, utilizing the attribute in the conditions
@user.initiated_conversations
Другие вопросы по тегам