2014-03-25 100 views
6

我需要實現預訂功能,並確保預訂不會在Rails應用中重疊。如何測試兩個時間範圍是否重疊?

cover?between?方法不是我所需要的。與相同型號的其他潛在範圍相比,我必須確保時間範圍的獨特性,並且有效地進行。

我認爲可以使用overlaps?來完成。問題是,這這樣的事情返回TRUE:

(1..5).overlaps?(5..9) 
=> true 

如果我相比,預訂,截止權當另一開始(3:30 - 4:004:00 - 4:30),它會說,他們做的重疊,但他們在技術上沒有。那會是個問題吧?

ValidatesOverlap似乎處理的問題,包括邊緣重疊。

有什麼建議嗎?

+0

什麼檢查範圍中的一個是否涵蓋其他範圍內的兩個端點? –

+0

需要將其轉換成包含* miliseconds *的Time對象..我認爲 –

+0

找到了這個gem:https://github.com/robinbortlik/validates_overlap,似乎可以處理包括重疊邊在內的rails問題。 –

回答

10
def overlap?(x,y) 
    (x.first - y.end) * (y.first - x.end) > 0 
end 

將工作。問題是Interval使用>=,如您在「Test if two date ranges overlap in Ruby or Rails」中看到的。

+1

另一個技巧不起作用,因爲浮點很奇怪。 (1..5-2 * Float :: EPSILON).overlaps?(5..9) => true irb(main):049:0>(1..5-2 * Float :: EPSILON) .5-3 * Float :: EPSILON).overlaps?(5..9) => false' –

+0

這應該是'(x.first - y.end)*(y.first - x.end) > = 0',否則日期不會重疊。 – Johnny

+0

@Johnny不,OP特別要求提供一個日期不重疊的情況。 – jazzpi

0

對於您的情況,爲什麼我們必須包含結束時間?畢竟,當時的預訂已經完成,從那時起可以使用插槽。所以下面應該是有道理的。

(1...5).overlaps?(5...9)

相關問題