【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)

이제 기존의 시작~종료 사이의 기간에, 만들려고 한 신규 예약을 연주할 수 있게 되었습니다!

감상



알고리즘의 중요성을 실감했습니다.
우선 해당하지 않는 경우를 생각하고 반대로 해당하는 경우를 도출하는 도모건의 법칙은 앞으로도 사용할 장면이 있을 것 같습니다!

참고



이하의 기사를 참고로 했습니다. 고마워요.
  • 기간이 중복되어 있는지를 판정하는 조건식의 도출 방법
  • 날짜 기간 중복 확인
  • 좋은 웹페이지 즐겨찾기