【问题标题】:Dealing with time periods in Rails 3.1在 Rails 3.1 中处理时间段
【发布时间】:2012-03-23 12:34:10
【问题描述】:

我正在 Rails 3.1 中开发一个预订系统。我为预订创建了一个模型:

# == Schema Information
#
# Table name: bookings
#
# id           :integer         not null, primary key
# product_id   :integer
# customer_id  :integer
# booked_from  :datetime
# booked_to    :datetime
# paid         :boolean
# payment_type :string(255)
# created_at   :datetime
# updated_at   :datetime
#

所以我想要做的是验证每个条目并检查所需的时间段(booked_from-booked_to)是否与具有相同 product_id 的另一个预订的任何时间段重叠。这些产品还有一个 available_from 和 available_to 字段,它也必须对其进行验证。

我该怎么做?

【问题讨论】:

标签: ruby-on-rails validation model


【解决方案1】:

检查这是否有效:

class Booking
  validate :booking_period_not_overlapped
  private
    def booking_period_not_overlapped
      unless Booking.where(
        '(booked_from <= ? AND booked_to >= ?) OR (booked_from >= ? AND booked_from <= ?)',
        booked_from, booked_from,
        booked_from, booked_to
      ).empty?
        errors.add(:booked_from, 'Invalid period.')
      end
    end
end

它只是检查是否有任何现有记录的booked_from和booked_to满足以下条件之一(假设您的新预订是从16:00到17:00):

  1. 在新预订之前开始,尚未结束(例如 15:00 - 16:30 或 15:00 - 17:30)
  2. 在新的预订时段内开始(例如 16:20 - 16:50 或 16:30 - 17:30)

【讨论】:

  • 在添加 errors.add(....) 后工作,除非 Booking.where... 将其添加到您的答案中,以便我可以检查它是否正确,sqlite 也抱怨斜杠,所以移动上线并删除它。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多