Rails 5 моделирует отношения многие ко многим - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть две модели, проект и пользователи, и я хочу соединить их следующим образом:

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 Association?Я застрял на этом.

1 Ответ

0 голосов
/ 26 сентября 2018

Да, 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

Project

# == 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

ProjectMember

# == 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
...