在我的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
对应于预订的长度/期限。
我如何检查新预订是否属于其他预订范围及其时间?
答案 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