Работа с периодами времени в Rails 3.1 - PullRequest
1 голос
/ 23 марта 2012

Я разрабатываю систему бронирования в 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, которые он также должен проверять.

Как мне это сделать?

1 Ответ

3 голосов
/ 23 марта 2012

Проверьте, работает ли это:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...