如何检查新事件(开始时间 - 结束时间)是否与之前的startime重叠 - 结束时间(Ruby)

时间:2015-07-04 22:02:08

标签: ruby-on-rails ruby api datetime appointment

我正在预约,安排API。我有许多DateTime格式的开始时间和结束时间配对。我需要确保在创建新约会时,时间与之前的约会不重叠。我的意思是,如果我预约从7月4日9:00开始到2015年7月4日13:00结束,我想进行验证,以便我无法开始新的应用在7/4/15 10:00结束于7/4/15 12:00。我想比较所有键值对,以确保新值不在该范围内。我有什么想法可以做到这一点吗?

2 个答案:

答案 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