无法在 Rails 中编写日期验证

Posted

技术标签:

【中文标题】无法在 Rails 中编写日期验证【英文标题】:Unable to write validations for dates in Rails 【发布时间】:2016-03-05 14:16:07 【问题描述】:

我正在尝试验证我的 Rails 应用程序中的日期。我正在使用 jQuery Datepicker 来选择在图书馆预订的开始和结束日期。我想在创建新预留之前检查数据库中是否没有任何其他预留,这将与正在创建的预留冲突。似乎无论我选择什么日期,它总是会抛出错误“不可用”。这是因为我使用的是 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】:

我的猜测是您的日期限制没有按您的预期工作。

看看这是否有效:

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)))

基本上是在检查

    是否有相同book_id的预订记录 是否存在to在新预订的fromto之间的预订记录 是否存在from在新预订的fromto之间的预订记录

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

【讨论】:

不幸的是,它的行为方式相同 - 即使所选日期是免费的并且在很远的将来也会显示错误

以上是关于无法在 Rails 中编写日期验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中验证日期?

在Rails 5模型中验证毕业日期

Rails:我无法在重定向中传递验证错误

无法在 Rails + React App 中验证 CSRF 令牌

无法在 Rails 中验证 CSRF 令牌的真实性

无法验证 CSRF 令牌的真实性 Rails/React