简体   繁体   中英

How to write a deep join query for a filter in rails 6?

I'm trying to write a filter. I have an orders model that has multiple services and each service has one worker assigned to perform it. I want to filter the order by the selected employee who performs any service in this order. I'm trying to do @orders = Order.joins(:services).joins(:employees).where(services: {employees: {id: params[:employee_id]}}) , I know that this is not correct. Please tell me how to make such a request.

order.rb

class Order < ApplicationRecord
  has_many :order_services, dependent: :destroy
  has_many :services, through: :order_services
end

order_service.rb

class OrderService < ApplicationRecord
  belongs_to :order
  belongs_to :service
  belongs_to :employee

  validates :order, presence: true
  validates :service, presence: true
  validates :employee, presence: true
end

service.rb

class Service < ApplicationRecord
  has_many :order_services, dependent: :destroy
  has_many :orders, through: :order_services
  belongs_to :employee, optional: true
end

employee.rb

class Employee < ApplicationRecord
  has_many :order_services
  has_many :services, through: :order_services
end

I want to note that my order_service model is a connecting model for the service and for the employee. In theory, the connection of the order and the service can only be in the presence of a worker. + an additional question is whether such interaction is not a bad practice, or it would be better to divide them into order_service and service_employee? Thanks.

我想这就是你所要求的。

@orders = Order.joins(:services).where(services: { employee_id: params[:employee_id] }).distinct

Order.joins(:order_services).where(order_services: {employee_id: params[:employee_id]})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM