Rails中有多个has_many关联
假设您有两个可以以不同方式关联的模型:
用户有许多他们创建的对话。 (一对多)用户有许多他们参与的对话。 (很多很多)
我的第一个想法是在对话表中存储创建对话的用户的ID,并将对话中涉及的用户关联到连接表中。
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。
谢谢。
关键是不要使用HABTM(其中所有关系都被认为是简单的),而是使用has_many,through,以及连接上的属性来指示表示对话的启动者/发起者的特定连接。
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