两个日期轨道之间的validation

我正在尝试创建预约/预约预约,用户选择开始日期和结束日期两个日期,如何从开始日期和结束日期validation日期,并validation这两个日期之间的日期, 防止用户再次选择开始日期,结束日期和日期之间的日期。

数据库

date_start | date_end 14/11/2017 14/18/2017 

视图:

日期的日期字段

      

模型

 class Reservation < ApplicationRecord belongs_to: user validates :date_start, uniqueness: true validates :date_end, uniqueness: true end 

我使用了validates :date_start, uniqueness: truevalidates :date_end, uniqueness: true但它只检查日期开始和date_end但它不检查它们之间的日期。

您将不得不使用单独的方法来保存复杂的validation代码。 使用validate :method_name (没有’s’)来调用它。

如果发现问题,该方法应该向对象添加错误。

像这样的东西:

 validate :no_reservation_overlap scope :overlapping, ->(period_start, period_end) do where "((date_start <= ?) and (date_end >= ?))", period_end, period_start end private def no_reservation_overlap if (Reservation.overlapping(date_start, date_end).any?) errors.add(:date_end, 'it overlaps another reservation') end end 
  validate :check_overlapping scope :overlaps, ->(date_start, date_end) do where "((date_start <= ?) and (date_end >= ?))", date_end, date_start end def check_overlapping errors.add(:date_start, 'your error messages') if overlaps(date_start, date_end).any? end 

结束