В моей системе бронирования отелей есть таблица номеров, которая имеет 4 типа номеров, связанных с конкретным отелем. Когда я бронирую номера, например, если я бронирую 2 односпальные кровати и 1 спальню с двуспальной кроватью, то свободные номера вычитаются. Моя проблема, когда пользователь выписывается, т.е. если дата отъезда> = сегодня, то я хочу получить забронированные номера обратно. Как я могу это сделать. это моя ассоциация:
class Booking < ApplicationRecord
belongs_to :hotel
belongs_to :user
validate :check_out_greater_than_check_in
end
class Hotel < ApplicationRecord
has_one :room, dependent: :destroy
has_many :bookings
belongs_to :city
validates :name, presence: true, uniqueness: true
scope :search_it, ->(s_term) { where("name LIKE ? OR city LIKE ?", "%#{s_term}%", "%#{s_term}%") }
has_attached_file :picture, styles: {large: "500x500>", medium: "300x300>", thumb: "150x150#"}
validates_attachment_content_type :picture, content_type: %r{\Aimage\/.*\z}
validates_attachment_presence :picture
end
class Room < ApplicationRecord
belongs_to :hotel
end
это мой контролер заказов:
class BookingsController < ApplicationController
before_action :current_hotel, except: [:new]
after_action :alter_rooms, only: [:create]
def new
@booking = Booking.new
@single = Room.joins(:hotel).where("hotel_id = ?", params[:hotel_id]).pluck(:single_bedroom_num)
@s = @single[0].to_i
@double = Room.joins(:hotel).where("hotel_id = ?", params[:hotel_id]).pluck(:double_bedroom_num)
@d = @double[0].to_i
@suite = Room.joins(:hotel).where("hotel_id = ?", params[:hotel_id]).pluck(:suite_room_num)
@sui = @suite[0].to_i
@dormitory = Room.joins(:hotel).where("hotel_id = ?", params[:hotel_id]).pluck(:dormitory_room_num)
@dor = @dormitory[0].to_i
s = params[:single_bedroom_num]
d = params[:double_bedroom_num]
su = params[:suite_room_num]
dor = params[:dormitory_room_num]
session[:hotel_id] = params[:hotel_id]
@hotel = current_hotel
end
def index
end
def create
@hotel = current_hotel.id
@booking = @hotel.bookings.build(book_params)
if signed_in?
params[:user_id] = current_user
else
authorize
end
if @booking.save
flash.now.alert = "booked successfully!"
redirect_to root_path
else
flash.now.alert = "Oops, couldn't book."
render :new
end
end
def show
@hotel = Hotel.find(params[:hotel_id])
check_in = params[:check_in_date]
check_out = params[:check_out_date]
@single = Room.single_bedroom_num
@booking = Booking.find(params[:id])
end
private
def book_params
params.require(:booking).permit(:id, :num_of_guests, :guest_name, :check_in_date, :check_out_date, :single_bedroom_num, :double_bedroom_num, :suite_room_num, :dormitory_room_num, :hotel_name, :hotel_id, :user_id)
end
def current_hotel
@current_hotel ||= Hotel.find(session[:hotel_id])
end
def alter_rooms
@single = Room.joins(:hotel).where("hotel_id = ?", session[:hotel_id]).pluck(:single_bedroom_num)
s = @single[0].to_i
@double = Room.joins(:hotel).where("hotel_id = ?", session[:hotel_id]).pluck(:double_bedroom_num)
d = @double[0].to_i
@suite = Room.joins(:hotel).where("hotel_id = ?", session[:hotel_id]).pluck(:suite_room_num)
sui = @suite[0].to_i
@dormitory = Room.joins(:hotel).where("hotel_id = ?", session[:hotel_id]).pluck(:dormitory_room_num)
dor = @dormitory[0].to_i
@so = @booking.single_bedroom_num
s_new = @so.to_i
@duo = @booking.double_bedroom_num
d_new = @duo.to_i
@suio = @booking.suite_room_num
sui_new = @suio.to_i
@doro = @booking.dormitory_room_num
dor_new = @doro.to_i
h_id = @booking.hotel_id.to_i
s_res = (s - s_new).to_i
d_res = (d - d_new).to_i
sui_res = (sui - sui_new).to_i
dor_res = (dor - dor_new).to_i
@room = Room.find_by(hotel_id: h_id)
@room.update_attributes(single_bedroom_num: s_res, double_bedroom_num: d_res, suite_room_num: sui_new, dormitory_room_num: dor_new )
end
end