【Rails】 날짜 기간 중복을 완벽하게 확인하고 싶습니다.
3452 단어 RailsActiveRecord
발단
「신규로 작성하는 기간이 작성 끝난 기간과 쓰이지 않게 밸리데이션 붙이고 있어~」
이런 부탁이 상사로부터 있어, 곧 실장할 수 있을 것이라고 생각했습니다만・・・
좀처럼 고전했기 때문에, 그 비망록입니다.
처음으로 고전한 점을 말하면,
작성된 시작부터 종료 사이의 기간에 새로 작성하면 검색에 걸리지 않는 점입니다.
그 해결책과 Rails에서의 구현 방법에 대해 써 갑니다.
시도한 것
이번에는 예로 예약 기간이 걸리지 않도록 하는 Reservation 모델에서 시도합니다.
처음에는 효율이 좋지 않지만 여기에서 시도했습니다.
Reservation.where(started_at: self.started_at..self.finished_at) or
Reservation.where(finished_at: self.started_at..self.finished_at)
그러나 문제점은 ...
그러나 위의 방법에서는 문제점이 떠올랐습니다.
대상 기간 2019/08/05 ~ 2019/10/15
기간① 2019/07/01 ~ 2019/07/30
기간② 2019/11/01 ~ 2019/11/30
기간③ 2019/07/30 ~ 2019/08/15
기간④ 2019/09/15 ~ 2019/10/30
기간 ⑤ 2019/09/01 ~ 2019/09/30
①~②는 대상외이기 때문에 걸리지 않는다, ③~④는 정상적으로 걸리지만,
문제는 ⑤가 걸리지 않는 것입니다.
사양에 따를지도 모릅니다만, 기간이 완전히 중복되고 있는데, 검색으로 걸려 주지 않는 것은 큰 문제입니다!
해결책
조사한 결과 해결책이있었습니다!
기간이 중복되어 있는지를 판정하는 조건식의 도출 방법 가 매우 도움이 되었습니다.
qiita.rb
puts 'code with syntax'
조건식
(対象終了日付 > 比較開始日付) AND (比較終了日付 > 対象開始日付)
이것을 ActiveRecord로 다시 작성하면,
Reservation.where('finished_at > ? and ? > started_at', self.started_at, self.finished_at)
이제 기존의 시작~종료 사이의 기간에, 만들려고 한 신규 예약을 연주할 수 있게 되었습니다!
감상
알고리즘의 중요성을 실감했습니다.
우선 해당하지 않는 경우를 생각하고 반대로 해당하는 경우를 도출하는 도모건의 법칙은 앞으로도 사용할 장면이 있을 것 같습니다!
참고
이하의 기사를 참고로 했습니다. 고마워요.
Reference
이 문제에 관하여(【Rails】 날짜 기간 중복을 완벽하게 확인하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tatsugon14/items/02e24f1656b42e06e2ab텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)