无法在Rails中为日期编写验证

时间:2016-03-05 14:16:07

标签: ruby-on-rails squeel

我正在尝试验证Rails应用中的日期。我正在使用jQuery Datepicker选择在库中预订的开始和结束日期。我想在创建新预留之前检查,db中没有任何其他预留,这与正在创建的预留冲突。似乎无论我选择什么日期,它总是抛出错误“不可用”。这是因为我使用的是Datepicker,而不是Rails中的标准date_field吗?

if Booking.where {
  (book_id == self.book_id) &
  (((from <= self.from) & (to >= self.from)) |
    ((from >= self.from) & (to <= self.to)) |
    ((from >= self.from) & (from < self.to) & (to >= self.to)))
}.any?
  errors.add(:from, "Not available")
end

我也尝试过:

def uniqueness_of_date_range
  errors.add(:from, "is not available") unless Booking.where { (from >= self.from) & (from <= self.to) }.count == 0
  errors.add(:to, "is not available") unless Booking.where { (to >= self.from) & (to <= self.to) }.count == 0
end

我正在使用squeel gem。我还尝试了SQL,包括数组和哈希语法,但它给了我关于语法的错误(即使它经过双重检查,100%正确)。

Booking.where { (from >= self.from) & (from <= self.to) }

所有其他试验都让我回到了不应该归还的记录。

当我使用

Booking.where { (from >= self.from) & (from <= self.to) }.pluck(:from).first

并将其与我的self.from进行比较,它显示了正确的答案。

1 个答案:

答案 0 :(得分:0)

我的猜测是您的日期约束无法按预期工作。

看看是否有效:

Booking.where { 
  (existing_booking.book_id == new_booking.book_id) &
  (((existing_booking.to >= new_booking.from) & (existing_booking.to <= new_booking.to)) | 
    ((existing_booking.from <= new_booking.to) & (existing_booking.from >= new_booking.from)))
}

基本上它正在检查

  1. 是否有相同book_id
  2. 的预订记录
  3. 是否有to在新预订fromto
  4. 之间的预订记录
  5. 是否有from在新预订fromto
  6. 之间的预订记录

    老实说,即使这有效,我认为这会产生一个糟糕的SQL查询...我希望其他人可以添加一些建议。