2017-12-13 17 views
1

그래서 나는이 모델의 약속이 있습니다검증하지만, 같은 클래스

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

을 지금이 상황은 : 나는 누군가가 같은 날, 같은에서 약속을 확인하는 것이 좋습니다 경우 오류가 발생 할 시각. 그래서 같은 클래스의 두 객체를 비교해야하고 어떻게 할 수 있는지 잘 모르겠습니다.

단 한 가지 내 마음

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 

에 와서 그리고 네 employee_id입니다은 약속 모델에서

+0

PORO 서비스 클래스 사용을 고려 했습니까? 하나의 좋은 유스 케이스처럼 보입니다. – jvillian

+0

나는 내일 그것을 고려할 것이다. 어쨌든 다른 대답이 나올 것이다. – proofexak

+1

범위를 전달하여 고유성을 검증 할 수 있습니다 :'validates : appointment_date, uniqueness : {scope : : appointment_time}' –

답변

2

당신은 단순히 당신의 약속이 있다면 분명히 그렇게

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 

같은 모델 검증을 사용할 수있다 시간 프레임 30 분이면 정확한 일치에 대해서만 점검하므로이 값을 변경해야합니다.

또한 정확하게 일치하는 처리 할 수 ​​있지만 appointment_timeappointment_date에 너무

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

처럼 @SebastianPalma에 의해 두 번째 오류를 추가합니다 첫 번째 언급 또는 둘 모두 추가 (하지만 너무 여러 쿼리를 실행으로 유일성 검사 자신의 글을 쓰거나 하나의 필드를 선택하는 것이 더 바람직하지 않음)

+0

첫 번째 솔루션은 흥미 롭습니다. 어딘가에 저장해야하지만 두 번째 솔루션은 매력처럼 작동합니다! 나는 이렇게 될 시간을 정했다 : 7:30 - 8:00 - 8:30 - ..... - 14:00. 대답은 Thx! – proofexak