在Rails 4中使用has_many

时间:2014-03-26 05:42:45

标签: ruby-on-rails associations

我实际上是想通过关联创建一个has_many。首先让我解释一下如何运作。

我有usersgroupsmembers个表格。规则如下:

  • 用户可以创建一个组(取决于它的角色)(组表有user_id)
  • 用户可以是一个或多个组的成员(成员表包含user_id和group_id)

这是我目前的关系类:

class User < ActiveRecord::Base
  # Associations
  has_many :groups # As user, I create many groups
  has_many :members
  has_many :groups, through: :members # But I can also belongs to many groups
end

class Group < ActiveRecord::Base
  # Associations
  belongs_to :user
  has_many :members
  has_many :users, through: :members
end

class Member < ActiveRecord::Base
  # Associations
  belongs_to :user
  belongs_to :group
end

我的问题是关于群体关系。您看到用户可以创建组,这意味着:

has_many :groups

但用户也可以是群组成员:

has_many :groups, through: :members

由于这种新的关系,我的75%的规格现在已被打破。此外,我注意到如果我使用与组关联的用户登录,我可以看到实际的组列表。但是当我尝试以组所有者(创建组的人)身份登录时,我看不到该用户创建的组。)

主意?

1 个答案:

答案 0 :(得分:1)

你不是在寻找一个关于has_many的关系

试试:

class User < ActiveRecord::Base
  # Associations
  has_and_belongs_to_many :groups
  has_many :created_groups, class_name: 'Group', foreign_key: 'creator_id'
end

class Group < ActiveRecord::Base
  # Associations
  belongs_to :creator, class_name: 'User'
  has_and_belongs_to_many :members, class_name: 'User'
end

如果您不需要会员类进行任何特殊处理,这是一个解决方案。 您应该进行类似的迁移:

class CreateGroupsUsers < ActiveRecord::Migration
  def change
    create_table :groups_users, id: false do |t|
        t.references :group
        t.references :user
    end
    add_index :groups_users, [:group_id, :user_id]
    add_index :groups_users, :user_id
  end
end

你必须确保你的群组表有一个creator_id!