【问题标题】:How to create 3 models in Rails 5 that are joined?如何在 Rails 5 中创建 3 个连接的模型?
【发布时间】:2018-01-11 20:55:11
【问题描述】:

我希望在 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 并给出行业 ID 和部门 ID?

【问题讨论】:

  • 为什么不使用两个连接表?我猜您在 Industry-Department 和 Department-JobTitle 表中都有 HABTM 关系,如果这是真的,您可以轻松访问您的模型,例如:job_titles = Industry.first.departments.select do |dep| dep.job_titles end(这是一个粗略的示例)。
  • 请考虑,当您添加 belongs_tohas_manyhas_and_belongs_to_many 时,它会添加访问和修改关联对象的方法,例如:my_industry.departments(其中 my_industry 是 Industry 类对象) .

标签: ruby-on-rails join activerecord ruby-on-rails-5 activemodel


【解决方案1】:

如果您对两种关系模型都使用一个表,您最终会得到很多重复的列。它可能应该分成 2 个表。

This rails docs sectionthis 很好地解释了选择使用 HABTMhas_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

【讨论】:

  • 我如何创建 DepartmentsIndustries 记录?我需要在 rails DepartmentsIndustries 中创建模型吗?
  • 不,如果你使用has_many :through,你只会创建中间模型
  • 至于分配部门/行业,您可以执行tech.departments.build(name: 'department name') 甚至tech.departments = [department_1, department_2] 等操作
猜你喜欢
  • 2014-07-18
  • 2017-05-20
  • 2012-02-25
  • 1970-01-01
  • 2015-12-21
  • 2011-01-24
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多