2008-11-10 5 views
2

항상 to_time 또는 to_date 메소드를 호출 할 필요없이 Rails에서 Dates and Times를 비교할 수 있기를 원합니다. 내가>, <,> =, < = 및 < =>이 작업을 할 수 있도록이 쓰기 쉬운 방법이 알고Rails의 날짜/시간 비교

class Date 
    def ==(other) 
    if other.kind_of?(Time) 
     self.to_time == other 
    else 
     super(other) 
    end 
    end 
end 

: 그래서 나는 다음과 같은 코드를 썼습니다. 그러나 나는 어떻게 잊었다 : P 어떤 아이디어?

답변

5

오래된 루비 클래스는 비교할 수 있도록하는 가장 쉬운 방법은 < => 인스턴스 메소드를 구현하고 Comparable 믹스 인을 포함하는 것입니다. 무료로>, <,> =, < =, == 등의 방법을 사용할 수 있습니다. 이 접근의

한 가지 방법은 include Comparable에 날짜 및 시간 클래스를 다시 열고 필요 (그렇지 않으면 원래 <=> 정의에 떨어지는) 경우, 날짜/시간 변환을 수행하는 자신의 <=> 방법을 재정의하는 것입니다.

+0

이것은 내가 찾고있는 답변입니다. 감사! – gsmendoza

0

예제는 괜찮아 보이지만 사용할 수는 없습니다. kind_of? - otherto_time을 구현하지 않으면 예외가 발생합니다!

업데이트 : 찾고있는 것은 아마도 <=> 연산자입니다!

1

글쎄, 날짜와 시간 클래스는 보통의 Ruby 비교 방법/연산자 인 < =>을 구현합니다.

Date#<=>Time#<=>의 설명서도 참조하십시오.

0

나는 다른 포스터가 언급 한 비교 연산자를 사용하여 이미 구현되었다고 생각합니다.

([email protected])(01:35)% ./script/console 
Loading development environment (Rails 2.2.0) 
irb(main):001:0> a = Date.now 
NoMethodError: private method `now' called for Date:Class 
    from (irb):1 
    from :0 
irb(main):002:0> a = Date.today 
    => Mon, 10 Nov 2008 
irb(main):003:0> b = Time.today 
    => Mon Nov 10 00:00:00 -0500 2008 
irb(main):004:0> a == b 
    => nil 
irb(main):005:0> puts "a" if a == b 
    => nil 
irb(main):006:0> puts "a" if a != b 
    a 
    => nil 
irb(main):007:0> 
+1

오류가> 또는 <연산자 인 경우 오류가 발생합니다. "ArgumentError : 날짜와 시간의 비교에 실패했습니다" – AShelly