警告:Total Rails Newb(TRN)。这应该是一个非常基本的问题,所以我希望有人可以节省几分钟来帮助解决问题。
假设我有以下模型:用户,组和成员 用户可以拥有多个群组(比方说朋友,家人等) 一个组可以有许多成员,即其他用户。
我如何构建这个?
最初我试过这个:
class User < ActiveRecord::Base
has_many :groups
has_many :groups, :through => :members
end
class Groups < ActiveRecord::Base
has_many :users, :through => :members
belongs_to :user
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
然而,这给了我一个用户错误,所以我改变了
has_many :groups, :through => :members
到
has_many :memberships, :through => :members, :source => :groups
当我尝试
时,仍然会收到关于缺少关联的错误group = Group.new
group.user.new
答案 0 :(得分:6)
它很有用:http://railscasts.com/episodes/47-two-many-to-many
class User < ActiveRecord::Base
has_many :members
has_many :groups, :through => :members
has_many :groups_as_owner, :class_name => "Group"
end
class Groups < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
belongs_to :owner, :class_name => "User", :foreign_key => :user_id
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
答案 1 :(得分:2)
基本上has_many-through关联是n:m关联(join-tables),它们(应该)拥有的属性多于连接记录ID的id ... ...
所以你有一个表Groups(带有id),一个表Users(带有id)和一个表成员(没有id,但是user_id和group_id)
基本上,你所做的几乎是正确的,只考虑你如何从用户访问一个组,反之亦然....用户首先会查找其会员信息,并通过该会员信息访问群组信息...反之亦然
所以你先设置
has_many :members
然后致电
has_many :groups, :through => :members
你需要的只是
class User < ActiveRecord::Base
has_many :members
has_many :groups, :through => :members
end
class Groups < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
你上面的代码中还有另一个错误
您可能想要使用
user = group.users.new
而不是
user = group.user.new
答案 2 :(得分:1)
试试这个结构:
class User < ActiveRecord::Base
has_many :members
has_many :groups, :through => :members
end
class Groups < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
end
class Member < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
另请查看has_and_belongs_to_many
,如果您不需要使用班级成员,则应使用has_and_belongs_to_many
。在这种情况下,不要忘记在数据库中创建连接表