Problem z walidacją

Witam, pomógłby ktoś napisać poprawną walidację dla wymagań które podam poniżej ? Nie mam pojęcia jak robi się coś takiego, potrzebuję użyć tego tylko jeden raz więc proszę serdecznie o pomoc kogoś kto zna się na tym i pisze takie coś w sekundę:) Jeżeli chcecie napisać coś głupiego to nie piszcie nic, proszę po prostu o pomoc kogoś kto chciałby jej udzielić:)

W bazie danych mam tabelę Appointment (którą dodaję formularzem i której parametry chcę sprawdzać) z polem godzina_wizyty, data_wizyty, doctor_id.
W tabeli Schedules mam: dzien_tygodnia, poczatek_pracy, koniec_pracy oraz doctors_workplace_id.
W Doctor_Workplace: doctor_id.
Chodzi o to, że potrzebuję sprawdzić przy dodawaniu wizyty czy lekarz przyjmuje w danym terminie i o danej godzinie, jeżeli nie wyświetlić komunikat.

Mój aktualny kod (ale to naprawdę próba zrobienia czegoś z czegoś czego nie potrafi się ogarnąćw moment:D)

	validate :check_doctor_available

        def check_doctor_available
		if DoctorsWorkplace.joins(:schedule).where(doctors_workplace.id == schedule.doctors_workplace_id)
			joins(:schedule).where(dzien_tygodnia: data_wizyty.wday)
            joins(:schedule).where('poczatek_pracy < ? and koniec_pracy > ?', godzina_wizyty, godzina_wizyty).empty?
      self.errors.add(:doctor, message: 'nie pracuje w tym terminie!')
    end 

Jest to ostatni punkt w projekcie nad którym spędziłem sporo czasu, którego teraz z powodu mnóstwa zaliczeń nie mam dlatego proszę o pomoc serdecznie :slight_smile:

Wklej kod klas Appointment, Schedules i Doctor_Workplace, bo coś czuję, że masz źle asocjacje porobione.

Appointment.rb:

class Appointment < ActiveRecord::Base
	validates :doctor_id, uniqueness: { scope: [:data_wizyty, :godzina_wizyty], message: 'Ten termin jest juz zajety!' }
	validate :check_doctor_available
	after_initialize :aInit
	after_save :aSave
	
	belongs_to :patient
	belongs_to :doctor
	belongs_to :schedule
	belongs_to :refferal
	belongs_to :clinic
	
	has_many :employees
	
	include MultiStepModel
	
	def self.total_steps
		3
	end
	
	def aInit 
		@wymaga_Potwierdzenia = true 
	end
	
	def aSave
		if self.refferal_id == nil
			@potwierdzona = false
		else
			@potwierdzona = true
		end
		if self.wymaga_Potwierdzenia == false
			@potwierdzona = true
		end
	end

	def check_doctor_available
		if DoctorsWorkplace.joins(:schedule).where(doctors_workplace.id == schedule.doctors_workplace_id)
			joins(:schedule).where(dzien_tygodnia: data_wizyty.wday)
            joins(:schedule).where('poczatek_pracy < ? and koniec_pracy > ?', godzina_wizyty, godzina_wizyty).empty?
      self.errors.add(:doctor, message: 'nie pracuje w tym terminie!')
    end
end

Schedule.rb:

class Schedule < ActiveRecord::Base

	has_many :appointments
	belongs_to :clinic
	belongs_to :doctors_workplace

	def full_schedule
		"#{dzien_tygodnia} : #{poczatek_pracy} - #{koniec_pracy}"
	end

end

Doctors_Worklpace.rb:

class DoctorsWorkplace < ActiveRecord::Base

has_many :schedules
belongs_to :doctor
belongs_to :clinic_surgery

end

Nie chciało mi się czytać całości, ale kod:

where(doctors_workplace.id == schedule.doctors_workplace_id)

sprowadza się do where(true) albo where(false)

Zamiast tego (chyba) trzeba by było 'doctors_workplaces.id = schedules.doctors_workplace_id'

Nie mam własnie pojęcia jak to zrobić, a jest to jedyna rzecz która mi została…

Wykorzystaj dobrze relacje które masz. Model Appointment ma relację z Doctor, ten z kolei z DoctorsWorkplace, w którym to możesz w końcu zrobić joins(:schedules) i odpytać o co tam chcesz.