Пользовательский валидатор Rails - PullRequest
0 голосов
/ 07 августа 2020

У меня есть настраиваемый валидатор рельсов ниже, который проверяет, доступно ли новое бронирование в рамках существующих бронирований, на основе даты начала и окончания. Я изо всех сил пытаюсь понять, как я могу добавить отдельную проверку «комнаты». Каждое бронирование предназначено для комнаты, поэтому я хочу убедиться, что диапазон дат указан только для указанного номера, а не для ВСЕХ бронирований, а только для отдельных номеров. Есть мысли?

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