2013-04-23 4 views
2

이벤트를 관리하기위한 레일 앱을 만들고 이벤트가 다른 이벤트와 겹치는 지 확인하기 위해 유효성 검사를 추가하고 싶습니다.레일 사용자 정의 유효성 검사는 오류가 있지만 여전히 저장하고 있습니까?

다음은 중복 이벤트를 확인하기 위해 내 사용자 지정 유효성 검사 코드입니다 : 난 아직도 중복되는 이벤트를 만들 수 있으며, 그들은 여전히 ​​저장되고있는

class Event < ActiveRecord::Base 
    attr_accessible :full_date, :start_hour, :end_hour, :address 

    validate :no_overlapping_events 

    def no_overlapping_events 
    overlap = false 
    same_date = Event.where(:full_date => self.full_date).where("id != ?", self.id).where(:address => self.address) 


    same_date.each do |t| 
     if self.start_hour <= t.start_hour 
     if self.end_hour >= t.start_hour 
      overlap = true 
      break 
     end 
     end 
    end 

    if overlap == true 
     errors.add(:base, "Can't have overlapping events!") 
    end 
    end 
end 

. 여기서 내가 뭘 잘못하고 있니?

답변

3

사용자 지정 유효성 검사 방법이 너무 빨리 끝납니다. 시도 :

class Event < ActiveRecord::Base 
    attr_accessible :full_date, :start_hour, :end_hour, :address 

    validate :no_overlapping_events 

    def no_overlapping_events 
    overlap = false 
    same_date = Event.where(:full_date => self.full_date).where("id != ?", self.id).where(:address => self.address) 

    same_date.each do |t| 
     if self.start_hour <= t.start_hour 
     if self.end_hour >= t.start_hour 
      overlap = true 
      break 
     end 
     end 
    end 

    if overlap == true 
     errors.add(:base, "Can't have overlapping events!") 
    end 
    end 
end 

또한, 논리 오류로, 어떤 사건에 대해 :

self.start_hour > t.start_hour and self.start_hour < t.end_hour 
+0

내가 끝을 추가하지만 여전히 말아야 때 절약 할 수 있습니다. 나는 어떻게 내가 논리 오류를 만들고 있는지 보지 못한다. 예를 들어, e2.start_hour e1.start_hour. 즉, e2는 e1 이전에 시작하지만 e2의 종료 시간은 e1의 시작 시간과 종료 시간 사이입니다. – dexx1220

+0

나는 당신이 "겹치는"것을 정의하는 것에 달려 있다고 생각합니다, 그래서 그 부분을 무시해도 좋습니다. 결국, 끝을 추가하기보다는'same_date = Event.where ... '줄 다음에있는 것을 제거하십시오. 그러나 나는 당신이 그렇게했거나 구문 오류가 있다고 생각합니다. 어쨌든 그렇게 할 수 있니? – Adnan

+0

나는 방금했다. 전체 코드는 완료되지 않았으며 일부만 완료했습니다. 더 많은 논리를 추가하고 싶지만 먼저 하나의 사례 만 테스트하려고합니다. 이상한 점은 저장된 레코드를 편집하여 겹치는 시간 슬롯을 지정하려고하면 유효성 검증이 실제로 시작되어 오류가 발생한다는 것입니다. 그러나 새 레코드를 만들려고 할 때 유효성 검사가 시작되지 않습니다. – dexx1220

관련 문제