首页 > 解决方案 > Rails 5 建模多对多关系

问题描述

我有两个模型,项目和用户,我想将它们连接如下:

class Project < ApplicationRecord
  belongs_to :owner, class_name: "User"
  has_many :members, class_name: "User"
end

class User < ApplicationRecord
  has_many :projects
end

迁移看起来像这样。

class AddReferencesToProject < ActiveRecord::Migration[5.2]
  def change
    add_reference :projects, :owner
    add_foreign_key :projects, :users, column: :owner_id, primary_key: :id
  end
end

我为 members_id 进行了迁移,但我希望它有多个 user_id:

class AddMembersReferencesToProject < ActiveRecord::Migration[5.2]
  def change
    add_reference :projects, :members
    add_foreign_key :projects, :users, column: :members_id, primary_key: :id
  end
end

我是否需要通过关联进行 many_to many :through 关联?我坚持这一点。

标签: ruby-on-railsrubyactiverecorddatabase-designmany-to-many

解决方案


是的,has_many :through这对您的多对多关联很有意义。(我不倾向于使用has_and_belongs_to_many,但这主要是个人喜好。)

它可能看起来像:

用户

# == Schema Information
#
# Table name: users
#
#  id                       :integer          not null, primary key
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
#
class User < ApplicationRecord
  has_many    :owned_projects, class_name: "Project", foreign_key: :owner_id
  has_many    :project_members, foreign_key: :member_id
  has_many    :projects, through: :project_members
end

项目

# == Schema Information
#
# Table name: projects
#
#  id                       :integer          not null, primary key
#  owner_id                 :integer
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
#
class Project < ApplicationRecord
  belongs_to  :owner, class_name: "User"
  has_many    :project_members
  has_many    :members, through: :project_members
end

项目成员

# == Schema Information
#
# Table name: project_members
#
#  id                       :integer          not null, primary key
#  member_id                :integer
#  project_id               :integer
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
#
class ProjectMembers < ApplicationRecord
  belongs_to  :member, class_name: "User"
  belongs_to  :project
end

推荐阅读