Сравнение даты с ActiveSupport:: Ошибка TimeWithZone
У меня есть метод age
в моей модели Waiver
, который выглядит так:
def age(date = nil)
if date.nil?
date = Date.today
end
age = 0
unless date_of_birth.nil?
age = date.year - date_of_birth.year
age -= 1 if date < date_of_birth + age.years #for days before birthday
end
return age
end
Затем у меня есть спецификация, которая выглядит так:
it "calculates the proper age" do
waiver = FactoryGirl.create(:waiver, date_of_birth: 12.years.ago)
waiver.age.should == 12
end
Когда я запускаю эту спецификацию, я получаю comparison of Date with ActiveSupport::TimeWithZone failed
. Что я делаю неправильно?
Failures:
1) Waiver calculates the proper age
Failure/Error: waiver.age.should == 12
ArgumentError:
comparison of Date with ActiveSupport::TimeWithZone failed
# ./app/models/waiver.rb:132:in `<'
# ./app/models/waiver.rb:132:in `age'
# ./spec/models/waiver_spec.rb:23:in `block (2 levels) in <top (required)>'
Ответы
Ответ 1
Вы сравниваете экземпляр Date
с экземпляром ActiveSupport::TimeWithZone
в выражении date < date_of_birth + age.years
; ActiveSupport:: TimeWithZone, в соответствии с документами, класс времени, который может представлять время в любом часовом поясе. Вы просто не можете сравнивать объекты Date
и Time
без какого-либо преобразования. Попробуйте Date.today < Time.now
на консоли; вы увидите аналогичную ошибку.
Выражения типа 12.years.ago
и типичные временные метки ActiveRecord - это экземпляры ActiveSupport:: TimeWithZone. Лучше всего убедиться, что вы имеете дело только с объектами Time
или Date
, но не оба в этом методе. Чтобы сделать сравнение с датой до даты, выражение может быть записано как:
age -= 1 if date < (date_of_birth + age.years).to_date