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
。
例如,这将允许您访问来自同一家公司的 Supervisor
的 drivers
和 chefs
。您将无法倒退并找到 Driver
的 supervisor
。
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
不完全您设想的查询,但它有效。
我的应用程序中有两个 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
。
例如,这将允许您访问来自同一家公司的 Supervisor
的 drivers
和 chefs
。您将无法倒退并找到 Driver
的 supervisor
。
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
不完全您设想的查询,但它有效。