如何检查预订日期是否与铁路酒店应用程序重叠

时间:2016-12-12 12:37:22

标签: ruby-on-rails ruby

我正在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

我想要什么

当用户尝试创建预订时,他们无法选择在他们想要入住酒店的那天预订的特定房间。

4 个答案:

答案 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根据您的要求。