18

我的模型上有一个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)>'
4

1 回答 1

38

您正在将一个实例DateActiveSupport::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
于 2012-10-10T03:04:12.330 回答