Has_many,通过协会

时间:2011-03-23 10:28:28

标签: ruby-on-rails-3

警告: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

3 个答案:

答案 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。在这种情况下,不要忘记在数据库中创建连接表