2008-11-10 102 views
2

我希望能夠比較Rails中的日期和時間,而無需總是調用to_time或to_date方法。所以我寫了下面的代碼:Rails中的日期/時間比較

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

我知道有一個簡單的方法來寫,這樣我可以使這個工作>,<,> =,< =和< =>。但我忘了如何:P任何想法?

回答

5

作出任何舊Ruby類可比最簡單的方法是實施< =>實例方法和包括Comparable混入。然後您可以免費獲得>,<,> =,< =,==等方法。處理這個的

一種方法是重新打開日期和時間類include Comparable並重新定義其<=>方法做日期/時間轉換(如有必要,回落原始<=>另有定義)。

+0

這是我正在尋找的答案。謝謝! – gsmendoza 2009-02-13 07:13:16

0

你的例子看起來不錯,但我不會用kind_of? - 如果other沒有實現to_time你得到一個異常呢!

更新:你在找什麼可能是<=>運營商!

1

那麼,Date和Time類簡單地實現了< =>,這是普通的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 2008-11-12 22:20:58