两个日期轨道之间的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: true
和validates :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
结束