Rails - 四个表关联 -

时间:2015-09-29 18:03:51

标签: ruby-on-rails ruby ruby-on-rails-3 associations rails-models

这里有一个rails新手,看着用4个表做一些工作而不完全确定如何构建关联。以下主题涉及房地产,可能有助于牢记这一点。

我有四种模式:

  • 物业 - 实体房屋
  • 项目 - 在一所房子里发生的大量工作
  • 工作 - 在一所房子里的特定工作
  • 工人 - 做这项工作的人

我在脑海中看到的联想是:

  • 一个属性可以有很多项目,工作和工人
  • 单个项目属于一个属性,但可以有多个作业和(通过作业)有很多工人
  • 一个作业属于一个项目和一个属性(通过项目),但可以有多个工人
  • 单个工作人员可以在一个属性上的一个项目上拥有一个作业

我的两个问题是:

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

  2. **如何在模型之间建立关联?无法理解如何做到这一点。

  3. 真的很感激任何想法!

    *****更新的模型结构 - 2015年9月30日 谢谢杰森 - 这就是我现在所拥有的(下面)

    我处理数据的主要目标如下: - 列出房产,项目,工作和工人 - 列出一组工作人员的项目和属性

    以下模型结构是否能实现上述目标?从我的观点来看似乎并不完全确定。

    模型设置为9/30

    • 物业模型 has_many:项目 has_many:工作,通过:: projects has_many:工人,通过::工作

    • 项目模型 belongs_to:property has_many:工作 has_many:工人,通过::工作

    • 工作模式 belongs_to:项目 has_many:workers

    • 工人模型 has_many:jobs

1 个答案:

答案 0 :(得分:1)

为了澄清,我认为你有这个:一个房产可以有很多项目。每个项目属于一个属性,可以有很多工作。每个工作属于一个项目,可以有很多工人。每个工人都属于一份工作。

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。这些可以在您的迁移(使用belongs_to函数)中建立,您可以在其中为这些模型创建表。它们看起来像这样:

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

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

编辑:

如果您想轻松访问所有财产的工作人员和所有项目工作人员,您可以为每个has_many through关联添加Property Project个关联1}}和Property模型。此外,您还可以向Property模型添加另一个关联,以便您访问所有属性的作业。它们看起来像这样:

has_many :jobs, through: :projects has_many :workers, through: :projects 模型补充:

Project

has_many :workers, through: :jobs 模型补充:

has_and_belongs_to_many

编辑:( OP澄清了所需的模型方案)

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

此工作与工作人员关系有两种选择:has_manythrough has_and_belongs_to_many。这些选项之间的主要区别在于has_many连接表中的每个记录只会建立作业与工作者之间的关联,并且不需要模型,但through Worker连接表可以包含有关该关联的其他信息。可以通过单独的模型访问该附加信息。例如,第二个选项可用于跟踪工作人员登录每个作业的小时数。 Here是对这些选项之间差异的更全面的描述。

如果您已经创建了Jobcreate_table模型,则应生成新的迁移以创建此连接表。否则,您可以在WorkerJob模型的迁移文件中包含以下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 import pandas as pd html_data = pd.read_html("https://www.gov.uk/performance/g-cloud/cumulative-sales-by-company-size") html_data[0] 关联的解释会更加冗长,因此我会推迟this page