在哈希数组中迭代一段时间

时间:2016-01-22 11:39:30

标签: ruby ruby-on-rails-4 web-applications iterator each

让我们设置一个哈希数组

@valid_periods = Array.new

我希望能够在" active = true"之间设置一段时间。和" active = false"州;如果在两个模型的属性(活动)之间检测到true(duty_status);然后生成一段时间(@valid_periods)。

如果没有合作伙伴,那么" true"有价值的模型(duty_status);然后合作伙伴将是DateTime.now

之前的时期
@valid_periods = Array.new
@my_duty_statuses.each do |duty_status_start|
  end_period = DateTime.now
  if duty_status_start[:active] == true
    start_period = duty_status_start.date_of_effectivity
    @my_duty_statuses.each do |duty_status_end|
      if duty_status_end[:active] == false
        end_period = duty_status_end.date_of_effectivity
        break
      end
    end
    @valid_periods.push({:start_period => start_period, :end_period => end_period})
  end
end

为简化起见,请检查员工的职务状态处于非活动状态的时间段。

2011-01-31 08:26:28 +0800 | true 
2014-03-03 13:26:28 +0800 | false 
2016-01-22 18:25:42 +0800 | true 

应该是这样的:

Date Start                  Date End
2011-01-31 08:26:28 +0800   2014-03-03 13:26:28 +0800
2016-01-22 18:25:42 +0800   DateTime.now

但我得到的是:

Date Start                  Date End
2011-01-31 08:26:28 +0800   2014-03-03 13:26:28 +0800
2016-01-22 18:25:42 +0800   2014-03-03 13:26:28 +0800

为什么我会得到2014-03-03 13:26:28 +0800?为什么end_period没有被第3行覆盖?我试过把它放在多个地方。

1 个答案:

答案 0 :(得分:0)

回答你的问题,为什么你总是end_period一样。 你试图@my_duty_statuses并在这个itteration中你从数组的开始就把它做同样的事情。所以你总是有相同的结果(2014-03-03 13:26:28 +0800)。

就像这样

arr, export = [true, false, true], []
arr.each { |bol|
  end_period = "true"
  if bol
    arr.each_with_index { |bol_2, i|
      unless bol_2
        puts "False on index(#{i})"
        end_period = "false"
        break
      end
    }
    export << end_period
  end
}
# False on index(1)
# False on index(1)
export
# => ["false", "false"]

如果您想设置第一个&#34; false&#34;持续#34;真&#34;所以,你可以使用像itteration这样的东西。

@valid_periods = []
@my_duty_statuses.each { |obj|
  if obj[:active]
    @valid_periods << {:start_period => obj.date_of_effectivity.to_s, :end_period => DateTime.now.to_s}
  else
    @valid_periods[-1][:end_period] = obj.date_of_effectivity.to_s
  end
}

也许这可以帮到你。

相关问题