Сравнение дат в рельсах
Предположим, что у меня есть стандартное datetime Post.first.created_at
. Могу ли я сравнивать это непосредственно с datetime в формате 2009-06-03 16:57:45.608000 -04:00
, делая что-то вроде:
Post.first.created_at > Time.parse("2009-06-03 16:57:45.608000 -04:00")
Изменить: Оба поля: datetimes, не даты.
Ответы
Ответ 1
Да, вы можете использовать операторы сравнения для сравнения дат, например:
irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true
Но вы пытаетесь сравнить дату с датой?
Если это произойдет, вы захотите преобразовать дату-время в дату и затем выполнить сравнение.
Надеюсь, это поможет.
Ответ 2
Да, вы можете напрямую сравнить значение поля даты и времени created_at
ActiveRecord с регулярным объектом DateTime
(например, тот, который вы можете получить для разбора строки).
В проекте у меня есть объект Value, который имеет объект created_at datetime:
imac:trunk luca$ script/console
Loading development environment (Rails 2.3.2)
>> Value.first.created_at
=> Fri, 12 Jun 2009 08:00:45 CEST 02:00
>> Time.parse("2009-06-03 16:57:45.608000 -04:00")
=> Wed Jun 03 22:57:45 0200 2009
>> Value.first.created_at > Time.parse("2009-06-03 16:57:45.608000 -04:00")
=> true
Поле created_at определяется как:
create_table "values", :force => true do |t|
[...]
t.datetime "created_at"
end
N.B. если ваше поле - дата, а не дата-время, то вам нужно преобразовать ее в определенное время:
Post.first.created_at.to_time > Time.parse("2009-06-03 16:57:45.608000 -04:00")
или проанализировать дату:
Post.first.created_at > Date.parse("2009-06-03 16:57:45.608000 -04:00")
в противном случае вы получите:
ArgumentError: comparison of Date with Time failed