2017-12-13 1 views
1

So habe ich dieses Modell Termin:Validierung mit zwei diffrent Objekte aber derselben Klasse

validates :purpose, :extra, :appointment_date, :appointment_time, presence: true 

und jetzt ist diese Situation: Ich möchte Fehler erhalten, wenn jemand Termin am selben Tag machen wollen und die gleiche Zeit. Also muss ich zwei Objekte der gleichen Klasse vergleichen und habe keine Ahnung, wie ich das machen kann.

nur eine Sache kommt mir in den Sinn

def allready_booked? 
    @employee = Employee.find(params[:employee_id]) <----- this is the part i dont know how to do it 
    @appointments = Appointment.where(appointment_date: appointment_date).where(employee_id: employee.id) 
    @appoitnments.each do |appo| 
    if(appo.appointment_date == appointment_date) 
     errors.add(:appoitnemnt_date, "is already booked") 
    end 
    end 
end 

Und ja employee_id ist in Termin Modell

+0

Haben Sie in Betracht gezogen, eine PORO Service Class zu verwenden? Scheint wie ein guter Anwendungsfall für einen. – jvillian

+0

Ich werde es morgen betrachten, vielleicht wird eine andere Antwort kommen, aber trotzdem danke! – proofexak

+1

Sie können versuchen, die Eindeutigkeit zu validieren, indem Sie einen Gültigkeitsbereich übergeben: validiert: Termin_Datum, Eindeutigkeit: {Umfang:: Termin_Zeit} ' –

Antwort

2

Sie einfach eine Modellvalidierung wie so

class Appointment < ActiveRecord::Base 
    validate :available_time 

    private 
    def available_time 
     other_appointments = Appointment.where(
          appointment_date: self.appointment_date, 
          appointment_time: self.appointment_time, 
          employee_id: self.employee_id 
          ) 
     unless other_appointments.empty? 
     [:appointment_date,:appointment_time].each do |attr| 
      errors.add(attr,"is not available") 
     end 
     end  
    end 
end 

Offensichtlich verwenden können, wenn Sie Ihre Termine haben ein Zeitrahmen z 30 Minuten müssen Sie dies ändern, da es nur gegen genaue Übereinstimmungen überprüft wird.

können auch exakte Übereinstimmungen behandelt werden, sondern Einzigartigkeit Überprüfung, wie so von @SebastianPalma erwähnt

class Appointment < ActiveRecord::Base 
    validates :appointment_date, uniqueness: {scope: [:employee_id,:appointment_time] } 
    # Or 
    validates :appointment_time, uniqueness: {scope: [:employee_id, :appointment_date] } 
end 

Der erste wird den Fehler zu appointment_date die zweite zu appointment_time oder beides fügt beide (fügen aber mehrere Abfragen laufen, so besser, um Ihre eigenen zu schreiben oder wählen Sie ein Feld als ungültig)

+0

Erste Lösung ist interessant, ich muss es irgendwo speichern, aber die zweite Lösung funktioniert wie ein Charme! Ich habe mir Zeit genommen, so zu sein: 7:30 - 8:00 - 8:30 - ..... - 14:00 und es funktioniert gut. Danke für die Antwort! – proofexak

Verwandte Themen