【问题标题】:hotel reservation validation through a searchform, ruby on rails通过搜索表单验证酒店预订,ruby on rails
【发布时间】:2013-08-06 19:39:42
【问题描述】:

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

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

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

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

谢谢大家

【问题讨论】:

    标签: ruby-on-rails validation search


    【解决方案1】:

    我会做几件事。一种是将您的预订逻辑放在单个模型之外,但要像 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

    【讨论】:

    • 好的,谢谢,我会试试的。这可能是一个非常愚蠢的问题,但是当您提出服务或管理器对象时,您到底是什么意思?我必须在哪里实施?
    • @AndyB Service/Manager/etc .. 这只是一个命名约定,不管你怎么称呼它。从概念上讲,它只是一个封装跨多个模型/领域逻辑的业务逻辑的地方。此外,它是您可以重复使用的封装。除了 Web 表单之外,您可能还有一个 API 允许进行预订——在这种情况下,您可能希望重用相同的服务对象。因此,您删除了实际 HTTP 层的任何概念,它所知道的只是您的实际业务逻辑。有意义吗?
    • 就磁盘上的位置而言,适合您的位置。也许在libapp/services/reservation_service.rb 等。
    【解决方案2】:

    没有。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2017-07-11
      • 1970-01-01
      相关资源
      最近更新 更多