Как создать 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