通过搜索表单确认酒店预订,ruby on rails

时间:2013-08-06 19:39:42

标签: ruby-on-rails validation search

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

我有一张房间,预订和顾客的桌子。预订表包含以下字段:room_id,customer_id,到达,离开。

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

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

感谢大家

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

他们都不是。

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