【问题标题】:Using has_many through in Rails 4在 Rails 4 中使用 has_many
【发布时间】:2014-03-26 05:42:45
【问题描述】:

我实际上是在尝试通过关联创建一个 has_many。让我先解释一下事情应该如何运作。

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

  • 用户可以创建一个组(取决于它的角色)(groups 表有一个 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% 的规格都被打破了。另外,我注意到如果我使用与组关联的用户登录,我可以看到实际的组列表。但是,当我尝试以群组所有者(创建群组的人)身份登录时,我看不到该用户创建的群组。

想法?

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

    您不是在这里寻找 has_many through 关系

    试试看:

    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
    

    而且你必须确保你的 groups 表有一个 creator_id !

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 2015-05-30
      • 2013-05-10
      相关资源
      最近更新 更多