2013-11-25 125 views
0

列表有一个所有者(用户)。一个名单也有一些小组成员(也是用户)。我试图定义三种模型之间的关系:用户,列表和小组成员。但我无处可去。has_many:通过和has_many关系相同的两个模型

user.rb

class User < ActiveRecord::Base 
    has_many :lists 
    has_many :panelMemberships, :through => :panelists, :source => :lists 
end 

list.rb

class List < ActiveRecord::Base 
    belongs_to :user 
    has_many :panelMembers, :through => :panelists, :source => :user 
end 

panelist.rb

class Panelist < ActiveRecord::Base 
    belongs_to :list 
    belongs_to :user 
end 

我已经尝试了所有不同COMBIN但似乎没有任何工作。预先感谢您提供的任何帮助。

回答

1

该模型对于任何贯穿模型都必须具有has_many关系,因此无论您拥有has_many:x,通过::y,还需要说has_many:y。如果小组成员是用户(除非你在做STI,你不是),你也不应该有一个与用户模型分开的小组成员模型。据我了解,你试图做这样的事情:

class User < ActiveRecord::Base 
    has_many :owned_lists, class_name: "List", foreign_key: :owner_id # this is for the owner/list relationship 
    has_and_belongs_to_many :lists # for the normal panelist/list relationship 
end 

class List < ActiveRecord::Base 
    belongs_to :owner, class_name: "User" 
    has_and_belongs_to_many :users 
end 

然后,你需要做迁移的users_lists(使用用户ID和清单的ID)表,这将是你的连接表,但将不需要它自己的模型。但如果你真的想保持这种关系(如果你使用加入模型做其他事情,那么你会很好),那么你应该这么做:

class User < ActiveRecord::Base 
    has_many :owned_lists, class_name: "List", foreign_key: :owner_id # this is for the owner/list relationship 
    has_many :panel_memberships 
    has_many :lists, through: :panel_memberships 
end 

class List < ActiveRecord::Base 
    belongs_to :owner, class_name: "User" 
    has_many :panel_memberships 
    has_many :users, through: :panel_memberships 
end 

class PanelMembership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :list 
+0

非常感谢。您的解决方案几乎完美,除了必须将belongs_to:owner,class_name:“User”更改为belongs_to:owner,:class_name =>“User”,:foreign_key =>:owner。现在一切都很好! – MikeC

+0

太棒了!噢,我想在轨道3你必须这样做;我大部分习惯于在不需要散列火箭的情况下使用导轨4。 – ussferox

相关问题