множественные ассоциации has_many в Rails - PullRequest
1 голос
/ 21 июля 2009

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

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

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

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 Ответ

7 голосов
/ 21 июля 2009

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...