Множественные ассоциации 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