В приложении для отеля я пытаюсь отфильтровать все доступные варианты размещения на определенную дату приезда и отъезда, поэтому пользователь видит их только как варианты.
Способ, которым я в настоящее время go говорю об этом, заключается в том, чтобы сначала определить все недоступные помещения, а затем вычесть их из всех помещений.
Вопрос
Когда я хочу изменить бронирование, я бы хотел:
- исключить текущее бронирование при оценке доступных мест
==> поэтому в @unavailable_accommodations
резервирование и его размещение для reservation.arrival
и reservation.departure
не оцениваются в операторе запроса
Возможно ли это, или как еще я могу добиться, чтобы получить доступное жилье только для прибывающего и отбывающего лица без учета текущего бронирования. Размещение:
Пример желаемого результата
- Скажем, что оговорка_1 бронирует проживание_1 с 1 января по 2 января.
- Затем есть оговорка_2, которая бронирует проживание_1 с 5 января по 6 января.
- Когда я впоследствии изменяю оговорку_1 и изменяю отъезд до 6 января, размещение_1 должно , а не быть помечено как доступное как уже оговорено_2, забронировало это размещение
код
модели
class Reservation < ApplicationRecord
belongs_to :hotel
belongs_to :accommodation
end
class Accommodation < ApplicationRecord
belongs_to :accommodation_category
has_many :reservations, dependent: :destroy
accepts_nested_attributes_for :accommodation_category
end
class Hotel < ApplicationRecord
has_many :accommodation_categories, dependent: :destroy
has_many :accommodations, through: :accommodation_categories
has_many :reservations, dependent: :destroy
end
Запрос
@unavailable_accommodations = Accommodation.joins(:reservations).where(reservations: {hotel: hotel}).where("reservations.arrival <= ? AND ? <= reservations.departure", arrival, departure)
.or(Accommodation.joins(:reservations).where(reservations: {hotel: hotel}).where("reservations.arrival >= ? AND ? >= reservations.departure", arrival, departure)).distinct
действие контроллера
def accommodations_availability
#check if there was an accommodation for this reservation
if !params[:reservation].nil?
reservation = Reservation.find(params[:reservation])
@prev_accommodation = reservation.accommodation
@previous_cat = @prev_accommodation.accommodation_category
end
hotel = Hotel.includes(:accommodations).find(params[:id])
arrival = Date.parse(accommodation_params[:arrival])
departure = Date.parse(accommodation_params[:departure])
time_span = arrival..departure
#SQL statement
@unavailable_accommodations = Accommodation.joins(:reservations).where(reservations: {hotel: hotel}).where("reservations.arrival <= ? AND ? <= reservations.departure", arrival, departure)
.or(Accommodation.joins(:reservations).where(reservations: {hotel: hotel}).where("reservations.arrival >= ? AND ? >= reservations.departure", arrival, departure)).distinct
@hotel_cats = hotel.accommodation_categories
@hotel_accos = Accommodation.where(accommodation_category: @hotel_cats)
@accommodations = @hotel_accos - @unavailable_accommodations
@available_cats = []
@accommodations.each do |acco|
if !@available_cats.include? acco.accommodation_category
@available_cats << acco.accommodation_category
end
end
respond_to do |format|
format.js
end
end