Ruby 在 Rails 自加入协会

Ruby On Rails self join associations

我的应用程序中有两个 table 和四个模型。第一个模型是公司,它有公司 table。其他模型是员工,driver 和主管。我在我的应用程序中使用了单一 table 继承。

公司型号:

class Company < ApplicationRecord

  has_many :employees

end

和table结构

ID   NAME
1    XXX company

和员工、Driver 和主管模型:

class Employee < ApplicationRecord

   belongs_to :company

end

class Chef < Employee


end

class Driver < Employee


end

class Supervisor < Employee


end

和员工 table 结构:

ID NAME    COMPANY_ID TYPE
1  Jo      1          Supervisor
2  Jack    1          Driver
3  William 1          Driver
4  Avarell 1          Driver
5  Sam     1          Chef

我需要做的是我希望主管通过 has_many 关联访问属于同一公司的所有 driver。

我在 supervisor class 中尝试了以下代码:

has_many :drivers, ->(supervisor) {where(company: supervisor.company)}

但是,rails 创建了以下内容 sql,这不是我所期望的

SELECT `employees`.* FROM `employees` WHERE `employees`.`type` IN ('Driver') AND `employees`.`supervisor_id` = 4 AND `employees`.`type` IN ('Driver', 'Supervisor') AND `employees`.`company_id` = 1

我希望 rails 在建立关联时创建这样的查询。

SELECT `employees`.* FROM `employees` WHERE `employees`.`type` IN ('Driver') AND `employees`.`company_id` = 1    

任何建议,

谢谢。

您可以通过 belongs_to 协会进行 has_many :through

例如,这将允许您访问来自同一家公司的 Supervisordriverschefs。您将无法倒退并找到 Driversupervisor

class Company < ApplicationRecord
  has_many :employees
end

class Employee < ApplicationRecord
  belongs_to :company
end

class Chef < Employee
end

class Driver < Employee
end

class Supervisor < Employee
  has_many :drivers, through: :company, source: :employees, class_name: 'Driver'
  has_many :chefs, through: :company, source: :employees, class_name: 'Chef'
end

它触发的 SQL 查询是

SELECT  "employees".* FROM "employees" INNER JOIN "companies" ON "employees"."company_id" = "companies"."id" WHERE "employees"."type" IN ('Driver') AND "companies"."id" = 1

完全您设想的查询,但它有效。