如何检查新事件(开始时间 - 结束时间)是否与之前的开始时间 - 结束时间重叠 (Ruby)
How can I check if a new event (start time - endtime) doesn't overlap with previous startime - endtimes (Ruby)
我正在预约,正在安排API。我有许多 DateTime 格式的开始时间和结束时间配对。我需要确保在创建新约会时,时间不会与之前的约会重叠。我的意思是,如果我有一个从 2015 年 7 月 4 日 9:00 开始到 2015 年 7 月 4 日 13:00 结束的约会,我想进行验证,这样我就无法进行新的预约开始于 2015 年 7 月 4 日 10:00 结束于 2015 年 7 月 4 日 12:00。我想比较所有键值对以确保新键值对不在该范围内。我有什么想法可以做到这一点吗?
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
当您有一个约会在此约会结束之前开始,并在此约会开始之后结束时,就会发生重叠。如果没有符合该标准的约会,则没有重叠。
请注意,您还需要考虑一种特殊情况,即搜索约会会发现一个重叠但这是您当前正在编辑的约会,因此您可以忽略那个。
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
我正在预约,正在安排API。我有许多 DateTime 格式的开始时间和结束时间配对。我需要确保在创建新约会时,时间不会与之前的约会重叠。我的意思是,如果我有一个从 2015 年 7 月 4 日 9:00 开始到 2015 年 7 月 4 日 13:00 结束的约会,我想进行验证,这样我就无法进行新的预约开始于 2015 年 7 月 4 日 10:00 结束于 2015 年 7 月 4 日 12:00。我想比较所有键值对以确保新键值对不在该范围内。我有什么想法可以做到这一点吗?
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
当您有一个约会在此约会结束之前开始,并在此约会开始之后结束时,就会发生重叠。如果没有符合该标准的约会,则没有重叠。
请注意,您还需要考虑一种特殊情况,即搜索约会会发现一个重叠但这是您当前正在编辑的约会,因此您可以忽略那个。
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