Rails中的日期/时间比较

时间:2008-11-10 08:17:24

标签: ruby-on-rails ruby

我希望能够在Rails中比较Dates和Times,而无需始终调用to_time或to_date方法。所以我写了下面的代码:

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

我知道有一种简单的方法可以写这个,这样我就可以使用>,<,> =,< =和< =>。但是我忘记了:P有什么想法吗?

4 个答案:

答案 0 :(得分:5)

使任何旧Ruby类可比较的最简单方法是实现< =>实例方法并包含Comparable mixin。您将免费获得>,<,> =,< =,==等方法。

解决此问题的一种方法是将日期和时间类重新打开到include Comparable并重新定义他们的<=>方法,以便在必要时执行日期/时间转换(退回原始<=> 1}}定义否则)。

答案 1 :(得分:1)

嗯,日期和时间类只是实现&lt; =&gt;,这是正常的Ruby比较方法/运算符。

另请参阅Date#<=>Time#<=>的文档。

答案 2 :(得分:0)

您的示例看起来没问题,但我不会使用kind_of? - 如果other未实现to_time,您仍然会遇到异常!

更新:您正在寻找的可能是<=>运营商!

答案 3 :(得分:0)

我相信你所要求的已经使用其他海报提到的比较运算符来实现。

(segfault@megumi)(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>