将has_many成员分组为postgres db

时间:2017-10-17 15:54:23

标签: ruby-on-rails arrays postgresql

我有一个成员表和分组表。

member表只有一个id和一个name属性。

groups表有一个id,name和members_ids作为数组

class CreateGroups < ActiveRecord::Migration[5.1]
  def change
    create_table :groups do |t|
      t.string :name
      t.text :member_ids, array: true, default: []

      t.date :created_at, null: false
    end
  end
end

member_ids在db:

中表示如下

{12,45,23,67,78}

我试图了解如何正确地建立关系。是否可以按照它们的方式创建与member_ids的关系,以便我可以急切地加载组和成员以进行显示?或者必须对每个ID数组进行查找?

1 个答案:

答案 0 :(得分:0)

使用数组来存储id可能看起来很聪明,但数组是有序集 - 而不是关系数据结构。

它不适用于ActiveRecord关联,并且当前支持外键数组的数据库很少。请参阅:The Importance of the Foreign Key Constraint

通过使用连接表完成用户和组之间的多对多关联。生成它:

rails g model membership user:belongs_to group:belongs_to

然后让我们设置我们的关联:

class User< ApplicationRecord
  has_many :memberships
  has_many :groups, through: :memberships
end

class Membership < ApplicationRecord
  belongs_to :user
  belongs_to :group
end

class Group < ApplicationRecord
  has_many :memberships
  has_many :user, through: :memberships
end

这使我们可以直接从用户转到组,反之亦然,rails将处理连接和创建连接行。

例如:

@group.members << current_user # makes the current_user a member
@user.groups.pluck(:name)  # returns an array of the names of the users groups.

要急切加载您要执行的记录:

Group.eager_load(:members)
# or 
User.eager_load(:groups)