检查时间如何与轨道重叠

时间:2016-05-01 00:03:49

标签: ruby-on-rails ruby model

我创建了一个模型:讲座(start_time,end_time,location)。我想编写验证函数来检查新讲座的时间是否与数据库中保存的讲座重叠。这样我就可以知道该位置是否在那段时间内被占用。我的职责是:

class Lecture < ActiveRecord::Base

validates :title, :position, presence: true

validates :start_time, :end_time, format: { with: /([01][0-9]|2[0-3]):([0-5][0-9])/,
         message: "Incorrect time format" }

validate: time_overlap

def time_overlap
    Lecture.all.each do |user| 
       if (user.start_time - end_time) * (start_time - user.end_time) >= 0                       
       errors.add(:Base, "time overlaps")
       end
     end 
end

end

错误消息: LecturesController中的NoMethodError #create 未定义的方法` - @'代表nil:NilClass 。如何以正确的格式编写此函数?

2 个答案:

答案 0 :(得分:1)

看一下Ruby 2.3.0的Time类:http://ruby-doc.org/core-2.3.0/Time.html

您可以使用它来检查Time实例是在另一个Time实例之前还是之后,例如:

t1 = Time.now
t2 = Time.now
t1 < t2
=> true
t1 > t2
=> false

因此,为了检查数据库中现有讲座中是否存在给定时间,您可以编写一些Ruby来检查建议的Lecture的开始时间或结束时间是否位于任何现有的开始时间之后和结束时间之前讲座。

答案 1 :(得分:0)

假设您有两个时间段,例如:

start_time_a
end_time_a
start_time_b
end_time_b

在三种情况下,两个时隙之间可能存在重叠。

1)start_time_b >= start_time_a && start_time_b =< end_time_a(即,插槽b从插槽a的中间开始)
2)end_time_b >= start_time_a && end_time_b <= end_time_a(即插槽b在插槽a之间的某个位置结束)
3)start_time_b <= start_time_a && end_time_b >= end_time_a(即,插槽b大于插槽a,并完全覆盖插槽

如果检查这三个条件,则可以确定两个时隙之间是否有重叠。

可以使用start_time_b.between?(start_time_a, end_time_a)简化条件1和2。