这里有一个rails新手,看着用4个表做一些工作而不完全确定如何构建关联。以下主题涉及房地产,可能有助于牢记这一点。
我有四种模式:
我在脑海中看到的联想是:
我的两个问题是:
考虑上述关系的最佳方式是什么?
**如何在模型之间建立关联?无法理解如何做到这一点。
真的很感激任何想法!
*****更新的模型结构 - 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
答案 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_many
和through
has_and_belongs_to_many
。这些选项之间的主要区别在于has_many
连接表中的每个记录只会建立作业与工作者之间的关联,并且不需要模型,但through
Worker
连接表可以包含有关该关联的其他信息。可以通过单独的模型访问该附加信息。例如,第二个选项可用于跟踪工作人员登录每个作业的小时数。 Here是对这些选项之间差异的更全面的描述。
如果您已经创建了Job
和create_table
模型,则应生成新的迁移以创建此连接表。否则,您可以在Worker
或Job
模型的迁移文件中包含以下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。