Rails:如何使用has_many through in multiple degrees separation
Rails: How to use has_many through in multiple degrees of seperation
我有一系列模型关联使用has_many
/belongs_to
,如下:
User
< Company
< Project
< Task
> Employee
> Company
(循环)。如下:
我使用 has_many :tasks, through: :projects
在两个分离度为 2 的模型(例如 Company
和 Task
)之间建立了关联。
是否也可以通过这种方式将模型与多个(3 个或更多)分离度(例如 Company
与 Employee
)相关联?这样我也许可以放弃 Company
< Employee
(因此循环)关联。
目标是在从我的 projects
控制器中保存新员工时能够使 employee.company
可用。
有可能:
例如:Company
和 Employee
class Company < ActiveRecord::Base
has_many :projects
has_many :tasks, through: :projects
has_many :employees, through: :tasks
end
Rails 用 joins
查询施展魔法
The goal is to be able to make employee.company available in the Employee model, when saving a new employee from my projects controller.
这很确定,因为 Employee
已经属于 Company
如果没有 Company < Employee 关联来指定哪家公司雇用了哪位员工,我不确定您能否做到这一点。
当然,即使没有 Company < Employee 关联,您仍然应该可以调用 employee.projects.first.company
之类的东西。但是没有直接关联,employee.company
是不可能的。由于 Employee has_many Projects,您总是必须指定您指的是哪个 Project 的公司。您可以为 shorthand 的 Employee class 添加一个方法,例如:
def company(project)
project.company
end
并致电 employee.company(@project)
。但这并不能真正解决问题。
就我个人而言,我认为保留 Company < Employee 关联会更合乎逻辑。 Employee 这个词意味着有某种雇主(可以是公司、其他人、个体户或任何其他人)雇用该雇员。
我有一系列模型关联使用has_many
/belongs_to
,如下:
User
< Company
< Project
< Task
> Employee
> Company
(循环)。如下:
我使用 has_many :tasks, through: :projects
在两个分离度为 2 的模型(例如 Company
和 Task
)之间建立了关联。
是否也可以通过这种方式将模型与多个(3 个或更多)分离度(例如 Company
与 Employee
)相关联?这样我也许可以放弃 Company
< Employee
(因此循环)关联。
目标是在从我的 projects
控制器中保存新员工时能够使 employee.company
可用。
有可能:
例如:Company
和 Employee
class Company < ActiveRecord::Base
has_many :projects
has_many :tasks, through: :projects
has_many :employees, through: :tasks
end
Rails 用 joins
查询施展魔法
The goal is to be able to make employee.company available in the Employee model, when saving a new employee from my projects controller.
这很确定,因为 Employee
已经属于 Company
如果没有 Company < Employee 关联来指定哪家公司雇用了哪位员工,我不确定您能否做到这一点。
当然,即使没有 Company < Employee 关联,您仍然应该可以调用 employee.projects.first.company
之类的东西。但是没有直接关联,employee.company
是不可能的。由于 Employee has_many Projects,您总是必须指定您指的是哪个 Project 的公司。您可以为 shorthand 的 Employee class 添加一个方法,例如:
def company(project)
project.company
end
并致电 employee.company(@project)
。但这并不能真正解决问题。
就我个人而言,我认为保留 Company < Employee 关联会更合乎逻辑。 Employee 这个词意味着有某种雇主(可以是公司、其他人、个体户或任何其他人)雇用该雇员。