RoR,无法从DateTime/TimeWithZone迭代

36

我有一个简单的任务,需要输入开始日期和结束日期,并循环遍历每一天/日期。这段代码将用于我的db:seed rake任务中。目前,我的代码已尝试了以下几种方法。

(someModel.start_date.to_datetime..someModel.end_date.to_datetime).each { 
    |x| puts x 
}
 ......
(someModel.start_date...someModel.end_date).each { |x| puts x }

每种情况下都会出现这样的错误。

can't iterate from ActiveSupport::TimeWithZone
or 
can't iterate from DateTime

如果有人知道如何迭代一系列的DateTimes,我将不胜感激。

5个回答

32
start = someModel.start_date.to_datetime
finish = someModel.end_date.to_datetime
while(start < finish) do
  #bunch of awesome stuff
  start += 1.day
end

1
谢谢你的回答,Chris。我有点挣扎,然后我读到日期是不可变的,然后就顺利了。 - Black Dynamite
你做到了,伙计。祝你好运。 - Chris Barretto

12
你必须确保正在处理一个Date对象(通过调用to_date方法),然后一切都会按预期工作。
start_date.to_date.upto(end_date.to_date) {|date| puts date }

或者使用范围:

(start_date.to_date..end_date.to_date).to_a

4
你无法从 DateTime 进行迭代。但是如果区间的开始和结束都是 Date 的实例,则可以进行迭代。请尽可能转换它们。
然后查看这些 Date 方法: 使用它们替代 each

0

这是我们正在做的事情,通过分钟迭代两个TimeWithZones:

  # allow iteration over a set of TimeWithZones
  def self.time_map(range, step: 30.minutes, &block)
    result = []
    time = range.first
    max = range.last
    test = range.exclude_end? ? ->(t) { t < max } : ->(t) { t <= max }
    value = block_given? ? ->(t) { yield(t) } : ->(t) { t }
    while test.call(time) do
      result << value.call(time)
      time += step
    end
    result
  end

0
如果您想在范围上进行迭代,可以考虑使用循环并使用类似于 someModel.start_date + 1.day.to_i 的方式每天步进。

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