2017-08-09 26 views
0

私のアプリケーションには2つのテーブルと4つのモデルがあります。最初のモデルは会社であり、それは企業テーブルを持っています。他のモデルは従業員、運転手、監督者です。私はアプリケーションで単一のテーブル継承を使用しました。Ruby On Rails自己結合関連

会社モデル:

class Company < ApplicationRecord 

    has_many :employees 

end 

とテーブル構造

ID NAME 
1 XXX company 

、従業員、ドライバーおよびSupervisorモデル:

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

'Driver'' has_one:supervisor'?あるいは、その協会は関係ありませんか? –

答えて

2

has_many :throughbelongs_toの関連付けを行うことができます。

たとえば、同じ会社の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

それは素晴らしい考えです! –