Validation 如果字段未更改,则在更新操作中排除自身的验证

Validation 如果字段未更改,则在更新操作中排除自身的验证,validation,activerecord,model,ruby-on-rails-3,Validation,Activerecord,Model,Ruby On Rails 3,我有一张叫做rents的桌子,上面有开始和结束的日期。然后,我创建了一个验证,这样新租金就不会与现有租金的开始日期和结束日期重叠 问题是,当我点击一个租金来更新它,如果我没有改变任何字段,点击更新。它试图验证自己,并说它与现有记录重叠。(其引用的现有记录就是它本身。) 我想做的事情是,我怎样才能让我的验证排除它自己。我的验证就是这样的 def should_not_overlap_rental_periods errors.add(:start_date, "can't overlap ot

我有一张叫做rents的桌子,上面有开始和结束的日期。然后,我创建了一个验证,这样新租金就不会与现有租金的开始日期和结束日期重叠

问题是,当我点击一个租金来更新它,如果我没有改变任何字段,点击更新。它试图验证自己,并说它与现有记录重叠。(其引用的现有记录就是它本身。)

我想做的事情是,我怎样才能让我的验证排除它自己。我的验证就是这样的

def should_not_overlap_rental_periods
  errors.add(:start_date, "can't overlap other rental periods") if self.rents.where("end_date <= ? and start_date >= ?", self.end_date.strftime("%Y-%m-%d"), self.start_date.strftime("%Y-%m-%d")).count > 0 unless self.rents.blank? 
end
def不应与租赁期重叠
错误。如果self.rents.where(“end\u date=?”,self.end\u date.strftime(“%Y-%m-%d”)、self.start\u date.strftime(“%Y-%m-%d”)、self.rents.strftime(“%Y-%m-%d”)、则添加(:start\u date,“不能与其他租期重叠”)。除非self.rents.blank,否则计数>0?
结束

您需要检查ActiveModel的脏检查模块。您可以检查属性是否已更改,并相应地分支您的逻辑


您需要检查ActiveModel的脏检查模块。您可以检查属性是否已更改,并相应地分支您的逻辑


我已重新格式化了您的代码,使其显示在代码块中。您可能希望重新格式化它,以便该方法的内容不会在一行上太宽而看不见。我已重新格式化了您的代码,使其显示在代码块中。您可能希望重新格式化它,以便该方法的内容不会在一行上太宽而看不见。