2017-08-09 132 views
0

我在我的應用程序中有兩個表和四個模型。第一個模型是公司,它有公司的表格。其他模型是員工,司機和主管。我在我的應用程序中使用了單表繼承。Ruby On Rails自聯接關聯

公司型號:

class Company < ApplicationRecord 

    has_many :employees 

end 

而且表結構

ID NAME 
1 XXX company 

和員工,司機和監事型號:

class Employee < ApplicationRecord 

    belongs_to :company 

end 

class Chef < Employee 


end 

class Driver < Employee 


end 

class Supervisor < Employee 


end 

和員工表結構:

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關聯訪問屬於同一公司的所有驅動程序。

我曾嘗試下面這段代碼在主管類:

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

然而,軌道創建下面的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 

我想軌在構建關聯時創建這樣的查詢。

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

任何suggesstions,

感謝。

+0

做一個'驅動程序''has_one:supervisor'?或者這種關聯不重要? –

回答

2

您可以通過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 

正是你預想的查詢,但它的工作原理。

+0

謝謝你的作品。我找到了另一個解決方案。 has_many:drivers,primary_key ::'company_id',foreign_key ::'company_id'這就創建了我期望的查詢 –

+0

這是個好主意! –