Rails - 四表关联 -

Rails - four tables associations -

一个 rails 新手,看着用 4 个表做一些工作,但不完全确定如何构建关联。下面的主题涉及房地产,记住这一点可能会有所帮助。

我有四个模型:

我脑海中的联想是:

我的两个问题是:

  1. 思考上述关系的最佳方式是什么?

  2. ** 如何建立模型之间的关联?我不知道该怎么做。

非常感谢任何想法!

***** 更新模型结构 - 2015 年 9 月 30 日 谢谢 Jason - 这是我现在拥有的(下方)

我处理数据的主要目标如下: - 列出一个 属性,它是项目、工作和工人 - 列出工人的一组项目和属性

下面的模型结构是否实现了以上的功能?在我看来似乎是这样,但不能完全确定。

模型设置为 9/30

澄清一下,我想你有这个:一个 属性 可以有很多项目。每个项目属于一个 属性,可以有多个作业。每个工作属于一个项目,可以有很多工人。每个工人属于一个工作。

Property 型号:

has_many :projects

Project 型号:

belongs_to :property
has_many :jobs

Job 型号:

belongs_to :project
has_many :workers

Worker 型号:

belongs_to :job

每个 project 应该有一个 property_id,每个 job 应该有一个 project_id,每个工人应该有一个 job_id。这些可以在您为这些模型创建 table 的迁移中(使用 belongs_to 函数)建立。它们看起来像这样:

create_table :projects do |t|
  t.belongs_to :property, index: true
  .
  . # your other attribute(s) here
  .
end

这将为 Project 模型提供 property_id 属性,允许您访问 ProjectProperty

编辑:

如果您想轻松访问 属性 的所有工作人员和项目的所有工作人员,您可以为每个 [=] 添加一个 has_many through 关联22=] 和 Project 模型。此外,您可以将另一个关联添加到 Property 模型,这将允许您访问 属性 的所有工作。它们看起来像这样:

Property 模型添加:

has_many :jobs, through: :projects
has_many :workers, through: :projects

Project 模型添加:

has_many :workers, through: :jobs

编辑:(OP 阐明了所需的模型方案)

现在,如果我们想要拥有它以便可以将一个工人分配给多个 属性,则需要一种不同类型的关联。首先,这个协会只需要处理工作和工人之间的关系。由于每个工作只有一个父项目,并且每个项目只有一个父项目 属性,因此可以通过该工作访问与工作人员拥有的任何工作相关联的项目和 属性。

此工作与工人的关系有两个选项:has_and_belongs_to_manyhas_many through。这些选项之间的主要区别在于 has_and_belongs_to_many 连接 table 中的每条记录只会建立工作和工人之间的关联,不需要模型,但是 has_many through join table 可以包含有关该关联的附加信息。这些附加信息将通过单独的模型访问。例如,第二个选项可用于跟踪工人在每项工作上登录的小时数。 Here 是对这些选项之间差异的更详尽的描述。

如果您已经创建了 WorkerJob 模型,您应该生成一个新的迁移来创建此连接 table。否则,您可以在 WorkerJob 模型的迁移文件中包含以下 create_table

这是 has_and_belongs_to_many 关联的迁移代码:

def change
  create_table :jobs_workers do |t|
    t.belongs_to :job, index: true
    t.belongs_to :worker, index: true
  end
end

Job 模型中,去掉这个:

has_many :workers

并将其替换为:

has_and_belongs_to_many :workers

Worker 模型中,去掉这个:

belongs_to :job

并将其替换为:

has_and_belongs_to_many :jobs

has_many through 关联的解释会更冗长,所以我将推迟到 this page