ruby RoR,无法从DateTime/TimeWithZone迭代

h7appiyu  于 2023-06-22  发布在  Ruby
关注(0)|答案(5)|浏览(134)

我有一个简单的任务,我想采取一个开始日期和结束日期,并在天/日期循环。这段代码正在我的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的线索,我会非常感激。

col17t5w

col17t5w1#

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

4uqofj5v2#

你必须确保你正在处理一个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
scyqe7ek

scyqe7ek3#

你不能从DateTime开始迭代。但是,当interval的start和end是Date的示例时,可以进行迭代。如果可能的话,转换它们。
然后看看这些Date方法:

用于代替each

cs7cruho

cs7cruho4#

如果您想在范围上进行迭代,您可以考虑每天使用someModel.start_date + 1.day.to_i之类的代码执行循环和步骤

omvjsjqw

omvjsjqw5#

下面是我们在两个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

相关问题