Appointment.joins(users: :roles).where(roles: {code: :physician}).where.not(users: {id: 1})
Таким образом, вы рассчитываете каждый прием на одного врача. (Замените code
эквивалентным столбцом в вашей таблице roles
)
Тем не менее, вы, кажется, говорите, что встреча всегда происходит между пациентом и пользователем. Если это так, то лучше подойдет следующая архитектура:
class User < ActiveRecord::Base
has_many :user_appointments
class Appointment < ApplicationRecord
belongs_to :patient, class_name: 'User' # needs a patient_id foreign key
belongs_to :physician, class_name: 'User' # needs a physician_id foreign key
Тогда вы можете запросить Appointment.where.not(physician_id: 1)
Редактировать комментарий:
Если вы хотите получить, скажем, все назначения для пациента № 10, исключая при этом встречи с врачами № 1 и № 2, вот как вы могли бы это осуществить:
class Appointment < ApplicationRecord
scope :joins_physician, -> { joins(users: :roles).where(roles: {code: :physician}) }
scope :joins_patient, -> { joins(users: :roles).where(roles: {code: :patient}) }
scope :excluding_physicians, -> (*physician_ids) { where.not(id: unscoped.joins_physician.where(users: {id: physician_ids})) }
scope :for_patients, -> (*patient_ids) { where(id: unscoped.joins_patient.where(users: {id: patient_ids})) }
end
Appointment.for_patients(1).excluding_physicians(1,2)
Как вы видите, это начинает становиться странно сложным для чего-то, что должно быть простым. Странность проистекает из структуры модели, не отражающей бизнес-ассоциации между Appointment
, User
и User
пациентом.