2008-11-10 58 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