如何检查新事件(开始时间 - 结束时间)是否与之前的开始时间 - 结束时间重叠 (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