我有一个成员表和分组表。
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数组进行查找?
答案 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)