验证重叠的日期/时间

时间:2016-12-12 09:18:56

标签: ruby-on-rails ruby postgresql validation date

在我的rails应用程序中,我有一个名为Booking的模型。用户可以通过选择日期然后选择时间来预订。

目前,我有一个验证,检查日期和时间组合是否已经存在,如果确实存在,则会引发错误。

我遇到的问题是每次预订都会持续一段时间,比如说4个小时。显然,我不能在早上8点30分预订用户,另一个在上午9点预订,虽然我的验证目前允许。

我希望能够检查:

  • 是否采用了日期和时间组合
  • 新预订是在进行不同的预订时进行的。

例如,

用户在2016/12/20上午8:30预订。预订持续4个小时。

另一位用户尝试在上午10点预订2016/12/201,但由于预订时间为上午8:30至中午12:30(4小时),因此无法验证。

这是我目前的验证方法:

def booking_available
    errors.add(:date, "and time is not available") unless Booking.where("? = date AND ? = time", date, time).count == 0
end

这是我尝试的另一个,虽然它只检查预订期结束:

def booking_available
    errors.add(:date, "and time is not available") unless Booking.where("? = date AND ? = time + interval ?", date, time, (bookingtime.to_i.to_s + 'h')).count == 0 
end

date列对应于预订日期,time对应时间,bookingtime对应于预订的长度/期限。

我如何检查新预订是否属于其他预订范围及其时间?

2 个答案:

答案 0 :(得分:0)

我不确定这对你有用,但你可以尝试这样的事情:

errors.add(:date, "and time is not available") unless Booking.where("? = date AND time BETWEEN ? AND ?", date, time - 4.hours, time + 4.hours).count == 0

如果您的time是ruby Time类对象,则此方法有效。

答案 1 :(得分:0)

您可能需要将日期和字段数据转换为日期时间格式:

#method to get datetime from date and time column
#given date format = '2016/12/20' , time format = '8.30am'
def datetime_value
  (date.to_s + " " + time.to_s.gsub('.',':')).to_datetime
end

def booking_available
  errors.add(:date, "and time is not available") unless Booking.where(datetime_value: datetime_value .. datetime_value + 4.hours).empty?
end