У меня есть настраиваемый валидатор рельсов ниже, который проверяет, доступно ли новое бронирование в рамках существующих бронирований, на основе даты начала и окончания. Я изо всех сил пытаюсь понять, как я могу добавить отдельную проверку «комнаты». Каждое бронирование предназначено для комнаты, поэтому я хочу убедиться, что диапазон дат указан только для указанного номера, а не для ВСЕХ бронирований, а только для отдельных номеров. Есть мысли?
validates :start_date, :end_date, :presence => true, availability: true
class AvailabilityValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
bookings = Booking.where(void:'f')
date_ranges = bookings.map { |b| b.start_date..b.end_date }
date_ranges.each do |range|
if range.include? value
record.errors.add(attribute, "not available")
end
end
end
end
РЕДАКТИРОВАТЬ: Следуя схеме. Довольно просто, все бронирования выполняются связанными с родителями пользователями (user_id), а комната - это просто еще один целочисленный атрибут в записи (всего 10 комнат).
create_table "bookings", force: :cascade do |t|
t.datetime "start_date"
t.datetime "end_date"
t.boolean "void", default: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "user_id"
t.integer "room"
t.index ["user_id"], name: "index_bookings_on_user_id"
end