сравнение даты с 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 is,согласно документам, класс, подобный времени, который может представлять время в любом часовом поясе. Вы просто не можете сравнить Date и Time объекты без выполнения какого-либо преобразования. Попробуй!--6--> на консоли, вы увидите подобную ошибку.

выражения типа 12.years.ago и типичные метки времени ActiveRecord являются экземплярами ActiveSupport:: TimeWithZone. Вам лучше всего убедиться, что вы имеете дело только с Time объекты или Date объекты, но не оба в этом методе. Чтобы сделать ваше сравнение date-to-date, выражение может быть записано как:

age -= 1 if date < (date_of_birth + age.years).to_date