날짜 개체와 함께 Ruby Range 사용

애플리케이션에서 기간을 정의해야 하는 것은 매우 일반적이며 대부분의 경우 시작 날짜와 종료 날짜로 모델링됩니다. 그런 다음 고객이 유료 회원인지 확인하기 위해 이 날짜를 현재 날짜와 비교합니다.

이러한 방식은 종종 읽기 어려운 메서드를 생성합니다.

class User
  def paying_member?
    subscription_started_at <= Date.current &&
      (subscription_ended_at.nil? || subscription_ended_at > Date.current)
  end
end


그러나 Ruby의 Range 클래스를 사용하여 코드의 가독성을 향상시키는 방법이 있습니다.

class User
  def paying_member?
    subscription_period.cover?(Date.current)
  end

  private

  def subscription_period
    subscription_started_at..subscription_ended_at
  end
end


고객이 구독을 종료하지 않은 경우 subscription_period는 술어의 유효성을 검사하는 무한 범위를 반환합니다.

이제 비즈니스에서 저장된 종료 날짜 하루 전에 구독이 종료된다고 가정하고 상한을 제외하는 범위를 반환하도록 subscription_period 메서드를 수정하는 것은 매우 간단합니다.

class User
  # ...
  def subscription_period
    subscription_started_at...subscription_ended_at
  end
end


Rails 애플리케이션에서는 ActiveSupport에 의해 Range 클래스에 추가된 메서드Range#===Range#overlaps?를 활용할 수도 있습니다.

class User
  def subscriber_kind
    case subscription_period
    when innovator_period then 'Innovator'
    when early_adopter_period then 'Early adopter'
    when early_majority_period then 'Early majority'
    when late_majority_period then 'Late majority'
    when laggards_period then 'Laggard'
  end

  def share_subscription_with(user)
    subscription_period.overlaps?(user.subscription_period)
  end
end


연결



  • Ruby Range API (v3.1)
  • Active Support Core Range Extensions
  • 좋은 웹페이지 즐겨찾기