我正在Ruby on Rails上为酒店制作一个Web应用程序。我看到一些问题可能与我的相同,但我找不到合适的解决方案。
用户可以创建预订并选择他们想要的房间以及他们到达和离开的日期。除了我的房间可以预订重叠日期之外,一切都按照我想要的方式运作。
模式:
create_table "bookings", force: :cascade do |t|
t.integer "user"
t.integer "course"
t.date "arriving_date"
t.date "leaving_date"
t.boolean "breakfast"
t.text "remarks"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "room_id"
t.integer "user_id"
t.index ["room_id"], name: "index_bookings_on_room_id", using: :btree
t.index ["user_id"], name: "index_bookings_on_user_id", using: :btree
end
create_table "rooms", force: :cascade do |t|
t.string "room_number"
t.integer "room_type_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["room_type_id"], name: "index_rooms_on_room_type_id", using: :btree
end
控制器
def new
@booking = Booking.new
end
def create
@booking = Booking.new(booking_params)
if @booking.save
redirect_to @booking
else
flash[:notice] = "Something went wrong"
render 'index'
end
end
预订模式
class Booking < ApplicationRecord
belongs_to :room
belongs_to :user
end
我想要什么
当用户尝试创建预订时,他们无法选择在他们想要入住酒店的那天预订的特定房间。
答案 0 :(得分:2)
在粗糙的伪代码中,我会使用实例方法扩展Room
# room.rb
def is_available? time_range
bookings.present?(:arrival < time_range.end AND :depature > timerange.start)
end
在控制器中的创建操作中调用此方法,就像在自己的答案中一样。
你肯定希望在没有循环所有预订的情况下这样做!
答案 1 :(得分:1)
我已经尝试了给定的答案,但我还不能让它工作。所以我制定了自己的解决方案,但由于“胖模型,瘦小的控制器”的缘故,我对此并不满意。
这对我有用:
def create
@booking = Booking.new(booking_params)
@date_start = @booking.arriving_date.strftime("%Y-%m-%d")
@date_end = @booking.leaving_date.strftime("%Y-%m-%d")
found = false
@all_bookings = Booking.all
@all_bookings.each do |booking|
arival_date = booking.arriving_date.strftime("%Y-%m-%d")
leave_date = booking.leaving_date.strftime("%Y-%m-%d")
if @date_start.between?(arival_date, leave_date) || @date_end.between?(arival_date, leave_date)
if booking.room_id == @booking.room_id
found = true
end
end
end
if found == true
redirect_to new_booking_path, notice: "This room is already booked in the period you want to book it"
else
@booking.save!
redirect_to @booking
end
end
我仍然对“正确”答案感兴趣:)
答案 2 :(得分:0)
确定。您将需要(在您的预订模型中):
validate(:validate_overlapping)
def validate_overlapping
self.errors[:date] = "Overlapping booking" if Booking.where(#check_your_dates#).first
end
答案 3 :(得分:0)
将以下内容添加到您的预订模式中
'detailpage' => array(
'exclude' => 1,
'label' => 'LLL:EXT:myExt/Resources/Private/Language/locallang_db.xlf:tx_myExt_domain_model_mdl1.detailpage',
'config' => array(
'type' => 'input',
'size' => 30,
'eval' => 'trim',
'wizards' => array(
'_PADDING' => 2,
'link' => array(
'type' => 'popup',
'title' => 'LLL:EXT:cms/locallang_ttc.xml:header_link_formlabel',
'icon' => 'link_popup.gif',
'module' => array(
'name' => 'wizard_element_browser',
'urlParameters' => array(
'mode' => 'wizard',
'act' => 'page'
)
),
'JSopenParams' => 'height=300,width=500,status=0,menubar=0,scrollbars=1',
),
),
'softref' => 'typolink',
),
),
请更改查询中的条件。 AND或OR根据您的要求。