0

我想为我的大学开发一个酒店预订系统作为一个项目。

我有一张用于房间、预订和客户的桌子。预订表有以下字段:room_id、customer_id、到达、离开。

我有一个搜索表,您可以在其中选择要预订的房间类型、到达和离开日期。填写表格后,应显示可用房间。

但我必须验证在日期期间是否真的有房间可用。有没有人知道应该在哪个模型中进行验证,因为我认为我必须访问多个模型,我需要房间模型中的房间类型以及预订模型中的到达和离开日期。

谢谢大家

4

2 回答 2

2

我会做几件事。一种是将您的预订逻辑放在单个模型之外,但要像一个ServiceManager对象一样将所有必要的对象作为输入,然后将您的所有业务逻辑包装在一起。

class RoomNotAvailableException < StandardError; end

class ReservationService
  def initialize(room, customer, arrival, departure)
    @room = room
    @customer = customer
    @arrival = arrival
    @departure = departure
  end

  def reserve!
    ActiveRecord::Base.transaction do
      if room_available?
        Reservation.create(:room => @room, :customer => @customer, :arrival => @arrival, :departure => @departure)
      else
        raise RoomNotAvailableException
      end
    end
  end

  private

  def room_available?
    Reservation.where(:room_id => @room.id, :arrival => @arrival, :departure => @departure).exists?
  end

end

在控制器中使用它

def create
  # get the objects from params or whatever
  service = ReservationService.new(room, customer, arrival, departure)
  begin
    service.reserve!
    flash[:notice] = "You are booked!" 
    redirect_to('somewhere')
  rescue RoomNotAvailableException => ex
    # whatever you need to do here..
  end
end

第二,如果您使用 Postgres,您可以使用CHECK CONSTRAINTS它为您进行检查。确保没有两个区间重叠。您必须四处搜索,但可以在一些 Postgres 线程中找到要点:

http://www.postgresql.org/message-id/20050520162508.GA87868@mighty.grot.org

于 2013-08-06T20:01:29.690 回答
0

他们都没有。

在处理多个资源时,通常最好创建一个不代表资源的单独控制器。这听起来像是其中一种情况。

于 2013-08-06T20:02:33.860 回答