Ruby/Rails中的日期范围

7
我希望在Rails种子中获得从开始日期到结束日期的日期范围。 当我尝试生成日期范围((Date.today - 10)..Date.today)时,异常发生了。异常信息:bad value for range。但在Rails控制台中一切都正常。我认为ActiveSupport对此是合理的(我的调试器告诉我)。Rails版本为3.1.3。怎么回事?

这是可以做到的!在遍历日期范围时,有许多边缘情况需要考虑,但如果您正在使用Rails中的ActiveSupport,这些情况可以优雅地处理。请查看我的答案https://dev59.com/z2Ik5IYBdhLWcg3wp_iM#19094504获取更多详细信息:D - captainpete
2个回答

10
您可以通过拆分两个边缘并检查它们的类来理解发生了什么,如下所示:
Date.today.class #  => Date 
(Date.today - 10).class # => Date 
((Date.today - 10)..Date.today).each {|d| puts d.class} # => 10 Date works for me

你遇到的错误大致如下所示:

('a'..10) # => ArgumentError: bad value for range

你能否发布你的范围内2个边缘的类?
(Date.today - 10).class => ?
Date.today.class       => ?

你在Rails环境中覆盖了任何类吗?它能在irb工作吗?
PS:由于它是一个ActiveSupport :: TimeWithZone,因此在Rails中可以使用10.days.ago,但您需要使用to_date。

边缘的类是日期,确实如此。 - Paul Brit
我相信你,但还是试一下 ((Date.today - 10).to_date..Date.today.to_date) - ecoologic

7
begin
  ((Date.today - 10)..Date.today).each { |date| puts date }
rescue
  $! # => #<NameError: uninitialized constant Date>
end

require 'date'
((Date.today - 10)..Date.today).each { |date| puts date }
# >> 2012-04-06
# >> 2012-04-07
# >> 2012-04-08
# >> 2012-04-09
# >> 2012-04-10
# >> 2012-04-11
# >> 2012-04-12
# >> 2012-04-13
# >> 2012-04-14
# >> 2012-04-15
# >> 2012-04-16

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接