Ruby on rails 日期范围验证不允许更新

Ruby on rails 日期范围验证不允许更新,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在我的模型上的reservation\u start和reservation\u end属性上有一些自定义验证 class DateRangeValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) record.date_ranges.each do |range| if range.include? value record.errors

我在我的模型上的
reservation\u start
reservation\u end
属性上有一些自定义验证

class DateRangeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.date_ranges.each do |range|
      if range.include? value
        record.errors.add(attribute, "#{options[:name]} not available")
      end
    end
  end
end
类DateRangeValidator 预订模式:

class Reservation < ActiveRecord::Base
  belongs_to :user
  belongs_to :transport

  validates_presence_of :user, :transport, :reservation_start, :reservation_end

  validates :reservation_start, 
    date_range: {name: "Start date"},
    date_past:  true

  validates :reservation_end, 
    date_range:   {name:  "End date"},
    date_subset:  true,
    start_bigger: true

  def date_ranges
    reservations = Reservation.where(["transport_id =?", transport_id])
    reservations.map { |e| e.reservation_start..e.reservation_end }
  end

end
类保留
这样做的问题是,如果我想编辑一条记录,将
reservation\u end
减少一天,验证就开始了。我尝试将验证设置为
on::create
,但这不是一个好主意


继续的最佳方法是什么?

我最初的想法是,如果当前记录已经被保存(即,
id
字段已经填充),则在
date\u范围内更改查询以排除当前记录。它看起来像:

def date_ranges
  reservations = Reservation.where({transport_id: transport_id})
  reservations = reservations.where(['id <> ?', id]) if !id.nil?
  reservations.map { |e| e.reservation_start..e.reservation_end }
end
def date_范围
保留=保留。其中({transport\u id:transport\u id})
保留=保留。其中(['id',id])如果!无身份证?
reservations.map{e|e.reservation_start..e.reservation_end}
结束

reservations=reservations.where(['id',id])if!id.nil?
应排除当前记录iff(当且仅当)它已被持久化,在这种情况下,在编辑以前创建的
保留时,验证应该通过,只要它不与任何其他
保留重叠

,如果不包括模型,就很难从您的帖子中看出您要验证什么。如果在您希望减少保留时运行验证,为什么会出现问题?验证是否会失败?如果是这样的话,听起来您的验证设置不太正确。它不会让我减少预订量,因为它已经被我试图更新的记录使用了。哦,天哪,我怎么没有注意到这一点。发生在我们当中最好的人身上;)