【问题标题】:group has_many members as array of member_ids in postgres db组 has_many 成员作为 postgres db 中的 member_ids 数组
【发布时间】:2017-10-17 15:54:22
【问题描述】:

我有一个成员表和组表。

members 表只有一个 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 在数据库中是这样表示的:

{12,45,23,67,78}

我正在尝试了解如何正确处理这些关系。是否可以按照 member_ids 的方式创建关系,以便我可以急切加载组和成员以进行显示?还是必须对每个 id 数组进行查找?

【问题讨论】:

  • 你如何定义组和成员之间的关联?

标签: ruby-on-rails arrays postgresql


【解决方案1】:

使用数组来存储 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2021-02-23
    • 2016-03-16
    • 2020-09-26
    • 2017-09-14
    相关资源
    最近更新 更多