Rails - 四表关联 -
Rails - four tables associations -
一个 rails 新手,看着用 4 个表做一些工作,但不完全确定如何构建关联。下面的主题涉及房地产,记住这一点可能会有所帮助。
我有四个模型:
- 属性 - 实体房子
- 项目 - 在房子里发生的一大组工作
- 工作 - 在家里的特定工作
- 工人 - 做工作的人
我脑海中的联想是:
- a 属性 可以有很多项目、工作和工人
- 单个项目属于一个 属性,但可以有多个作业并且(通过作业)有多个工人
- 单个作业属于一个项目和一个 属性(通过项目),但可以有多个工人
- 一个工人可以在一个项目上有一个工作属性
我的两个问题是:
思考上述关系的最佳方式是什么?
** 如何建立模型之间的关联?我不知道该怎么做。
非常感谢任何想法!
***** 更新模型结构 - 2015 年 9 月 30 日
谢谢 Jason - 这是我现在拥有的(下方)
我处理数据的主要目标如下:
- 列出一个 属性,它是项目、工作和工人
- 列出工人的一组项目和属性
下面的模型结构是否实现了以上的功能?在我看来似乎是这样,但不能完全确定。
模型设置为 9/30
属性 型号
has_many:项目
has_many:工作,通过::项目
has_many :workers, 通过: :jobs
项目模型
belongs_to :属性
has_many:职位
has_many :workers, 通过: :jobs
工作模型
belongs_to:项目
has_many:工人
工人模型
has_many:工作
澄清一下,我想你有这个:一个 属性 可以有很多项目。每个项目属于一个 属性,可以有多个作业。每个工作属于一个项目,可以有很多工人。每个工人属于一个工作。
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
属性,允许您访问 Project
的 Property
。
编辑:
如果您想轻松访问 属性 的所有工作人员和项目的所有工作人员,您可以为每个 [=] 添加一个 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_many
和 has_many
through
。这些选项之间的主要区别在于 has_and_belongs_to_many
连接 table 中的每条记录只会建立工作和工人之间的关联,不需要模型,但是 has_many
through
join table 可以包含有关该关联的附加信息。这些附加信息将通过单独的模型访问。例如,第二个选项可用于跟踪工人在每项工作上登录的小时数。 Here 是对这些选项之间差异的更详尽的描述。
如果您已经创建了 Worker
和 Job
模型,您应该生成一个新的迁移来创建此连接 table。否则,您可以在 Worker
或 Job
模型的迁移文件中包含以下 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。
一个 rails 新手,看着用 4 个表做一些工作,但不完全确定如何构建关联。下面的主题涉及房地产,记住这一点可能会有所帮助。
我有四个模型:
- 属性 - 实体房子
- 项目 - 在房子里发生的一大组工作
- 工作 - 在家里的特定工作
- 工人 - 做工作的人
我脑海中的联想是:
- a 属性 可以有很多项目、工作和工人
- 单个项目属于一个 属性,但可以有多个作业并且(通过作业)有多个工人
- 单个作业属于一个项目和一个 属性(通过项目),但可以有多个工人
- 一个工人可以在一个项目上有一个工作属性
我的两个问题是:
思考上述关系的最佳方式是什么?
** 如何建立模型之间的关联?我不知道该怎么做。
非常感谢任何想法!
***** 更新模型结构 - 2015 年 9 月 30 日 谢谢 Jason - 这是我现在拥有的(下方)
我处理数据的主要目标如下: - 列出一个 属性,它是项目、工作和工人 - 列出工人的一组项目和属性
下面的模型结构是否实现了以上的功能?在我看来似乎是这样,但不能完全确定。
模型设置为 9/30
属性 型号 has_many:项目 has_many:工作,通过::项目 has_many :workers, 通过: :jobs
项目模型 belongs_to :属性 has_many:职位 has_many :workers, 通过: :jobs
工作模型 belongs_to:项目 has_many:工人
工人模型 has_many:工作
澄清一下,我想你有这个:一个 属性 可以有很多项目。每个项目属于一个 属性,可以有多个作业。每个工作属于一个项目,可以有很多工人。每个工人属于一个工作。
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
属性,允许您访问 Project
的 Property
。
编辑:
如果您想轻松访问 属性 的所有工作人员和项目的所有工作人员,您可以为每个 [=] 添加一个 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_many
和 has_many
through
。这些选项之间的主要区别在于 has_and_belongs_to_many
连接 table 中的每条记录只会建立工作和工人之间的关联,不需要模型,但是 has_many
through
join table 可以包含有关该关联的附加信息。这些附加信息将通过单独的模型访问。例如,第二个选项可用于跟踪工人在每项工作上登录的小时数。 Here 是对这些选项之间差异的更详尽的描述。
如果您已经创建了 Worker
和 Job
模型,您应该生成一个新的迁移来创建此连接 table。否则,您可以在 Worker
或 Job
模型的迁移文件中包含以下 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。