Как создать 3 модели в Rails 5, которые объединяются?

Я хочу создать следующие модели в Rails 5:

Industry
Department
JobTitle

Пример данных:

Industry: Technology, Healthcare, Other
Department: Admin, Customer Support
JobTitle: Account Manager, Accountant

Отрасль высшего уровня, отделы могут принадлежать к одной или нескольким отраслям, а должности могут принадлежать одному или нескольким отделам.

У меня есть три модели, созданные выше в Rails, чего у меня нет, учитывая отрасль и отдел, как мне получить все JobTitles?

Как мне сохранить эти отношения и как запросить их?

Должен ли я создать 3 таблицы соединения модели, как:

IndustriesDepartmentsJobTitles
id | industry_id | department_id | job_title_id

Это был бы правильный способ сделать это? Если так, то как бы я тогда запросил для идентификаторов job_titles отраслевой_идентификатор & департамента?

Спасибо

1 ответ

Если вы используете одну таблицу для обеих моделей отношений, у вас будет много дублированных столбцов. Вероятно, следует разделить на 2 таблицы.

Эта секция документации рельсов, и у этого есть хорошее объяснение выбора способа выразить это отношение многих ко многим, используя HABTM против has_many through:,

В отрасли может быть несколько отделов, и наоборот.

class Industry << ApplicationRecord
  has_and_belongs_to_many :departments
end

# Relationship table needed: departments_industries

class Department << ApplicationRecord
  has_and_belongs_to_many :industries
  has_and_belongs_to_many :job_titles
end

# Relationship table needed: departments_job_titles

class JobTitle << ApplicationRecord
  has_and_belongs_to_many :departments
end

Образец миграции:

create_table :industries do |t|
  t.string :name
  t.timestamps
end

create_table :departments do |t|
  t.string :name
  t.timestamps
end

create_table :job_titles do |t|
  t.string :name
  t.timestamps
end

create_table :departments_industries do |t|
  t.belongs_to :industry, index: true
  t.belongs_to :department, index: true
  # ..
  t.timestamps
end

create_table :departments_job_titles do |t|
  t.belongs_to :department, index: true
  t.belongs_to :job_title, index: true
  # ..
  t.timestamps
end

Запрос:

tech = Industry.find_by(name: 'Technology')
department = tech.departments.find_by(name: 'Admin')
department.job_titles
Другие вопросы по тегам