我正在预约,安排API。我有许多DateTime格式的开始时间和结束时间配对。我需要确保在创建新约会时,时间与之前的约会不重叠。我的意思是,如果我预约从7月4日9:00开始到2015年7月4日13:00结束,我想进行验证,以便我无法开始新的应用在7/4/15 10:00结束于7/4/15 12:00。我想比较所有键值对,以确保新值不在该范围内。我有什么想法可以做到这一点吗?
答案 0 :(得分:1)
如果约会在此约会结束之前开始,并在此约会开始后结束,则会发生重叠。如果没有符合该条件的约会,则没有重叠。
请注意,您还需要考虑特殊情况,即搜索约会会找到一个重叠,但这是您当前正在编辑的约会,因此您可以忽略该约会。
class Appointment < ActiveRecord::Base
validate :no_overlapping_appointments
def no_overlapping_appointments
overlaps = Appointment.where('start_time <= ? AND end_time >= ?', end_time, start_time)
return if overlaps.empty?
return if overlaps.count == 1 && overlaps.first.id == id
errors.add(:start_time, "This appointment overlaps others")
end
end
答案 1 :(得分:0)
class Appointment < ActiveRecord::Base
validate :duration_not_overlap
private
def duration_not_overlap
verify_time(:starttime)
verify_time(:endtime)
end
# attr is :starttime | :endtime
def verify_time(attr)
errors[attr] << 'overlap' if Appointment.where(user_id: user_id, attr => (starttime..endtime)).exists?
end
end