Сравнение даты / времени в Rails - PullRequest
2 голосов
/ 10 ноября 2008

Я хочу иметь возможность сравнивать даты и время в Rails без необходимости вызывать метод 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 ]

5 голосов
/ 11 ноября 2008

Самый простой способ сделать любой старый класс Ruby сопоставимым - это реализовать экземплярный метод <=> и включить в него Comparable mixin. Тогда вы бесплатно получите методы>, <,> =, <=, == и т. Д. </p>

Один из подходов к этому состоит в том, чтобы заново открыть классы Date и Time в include Comparable и переопределить их <=> методы для выполнения преобразований даты / времени, если необходимо (в противном случае отступите к исходному определению <=>) .

1 голос
/ 10 ноября 2008

Ну, классы Date и Time просто реализуют <=>, который является обычным методом / оператором сравнения Ruby.

См. Также документацию Дата # <=> и Время # <=> .

0 голосов
/ 10 ноября 2008

Я считаю, что то, что вы просите, уже реализовано с использованием оператора сравнения, о котором упоминали другие авторы.

(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> 
0 голосов
/ 10 ноября 2008

Ваш пример выглядит хорошо, но я бы не стал использовать kind_of? - если other не реализует to_time, вы все равно получите исключение!

Обновление: вы, вероятно, ищете оператор <=>!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...