【问题标题】:Validation for date/times that overlap验证重叠的日期/时间
【发布时间】:2016-12-12 09:18:56
【问题描述】:

在我的 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 对应预订时长/周期。

我如何才能检查新预订是否在其他预订的范围及其时间范围内?

【问题讨论】:

  • 也许存储开始日期和结束日期而不是开始日期和持续时间会更容易,即2016-12-20 08:302016-12-20 12:30

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


【解决方案1】:

我不确定这是否适合您,但您可以尝试以下方法:

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 类对象,这将起作用。

【讨论】:

  • 不得不稍微修改一下,但是,BETWEEN 就是我要找的。谢谢
【解决方案2】:

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

#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 

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多