2011-05-02 44 views
1

我的模型有start_time:time和end_time:时间字段。我想要做的是检查我的特定Reservation模型的start_time到end_time范围是否与其他任何预订不重叠。Rails 3:验证时间范围内的时间模型唯一性

所以如果从第二个星期三下午4-6点开始预订,那么从下午4-6点起不能再有任何预约。我会如何去做这件事?我不太确定如何验证时间范围与来自其他预定条目的其他start_time,end_time元组。

回答

4

这样的,也许:

def intersects?(reservation) 
    to = reservation.end_time 
    from = reservation.start_time 
    Reservation.where('start_time > ? OR end_time < ?', to, from).count > 0 
end 
+0

这对于过去和未来的日期之间的预定不起作用。 – tonymarschall 2012-05-03 11:58:38

+0

我认为它的确如此。你能提供一个例子吗? – moritz 2012-05-03 13:49:38

+0

如果您在12:00至13:00之间预订并且从15:00至16:00预订并且想要预订14:00至15:00 Reservation.where('start_time> 14:00或end_time <15: 00')会计数。 – tonymarschall 2012-05-03 14:58:07

0

我会避免validates这个特定的需求,而只是让更多的东西一样

before_save :time_check 

def time_check 
    if #time in range 
     #reject 
    else 
     #accept! 
end 

或类似的东西,你需要与实际时间检查帮助吗? 只要记住你可以添加秒的时间对象Time.now + (60*60)*hours得到一个范围内<and> tests

+0

我只是不知道如何检查我的时间对倍,在其他条目。我的意思是,如果我有一个条目开始x和结束y,我怎么知道这些x和y是什么?基本上,我如何编写我的方法来检查我的Reservation表中的所有条目? – CCSab 2011-05-02 04:15:04

+2

你为什么要避免验证?他正在验证提交的数据... – Mischa 2011-05-02 04:23:09