2016-01-22 110 views
0
數組時間的時期

讓我們設定散列陣列遍歷在哈希

@valid_periods = Array.new 

我希望能夠設置「活性=真」和「活性=假之間的時間段「狀態;如果在兩個模型(duty_status)的屬性(活動)之間檢測到true,那麼會產生一段時間(@valid_periods)。

如果沒有一個「真」值模型(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年3月3日十三時26分28秒+ 0800?第3行怎麼沒有覆蓋end_period?我試着把它放在多個地方。

回答

0

回答你的問題爲什麼你的end_period一直都是一樣的。 您可以在@my_duty_statuses之間進行訪問,並且在此次迭代中,您可以從開始數組時開始同樣的操作。所以你總是有同樣的結果(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"] 

如果whant設置第一個「假」到最後「真」的話,你可以使用這樣的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 
} 

也許這可以幫助你。