让我们设置一个哈希数组
@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行覆盖?我试过把它放在多个地方。
答案 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
}
也许这可以帮到你。