我想为我的大学开发一个酒店预订系统作为一个项目。
我有一张用于房间、预订和客户的桌子。预订表有以下字段:room_id、customer_id、到达、离开。
我有一个搜索表,您可以在其中选择要预订的房间类型、到达和离开日期。填写表格后,应显示可用房间。
但我必须验证在日期期间是否真的有房间可用。有没有人知道应该在哪个模型中进行验证,因为我认为我必须访问多个模型,我需要房间模型中的房间类型以及预订模型中的到达和离开日期。
谢谢大家
我想为我的大学开发一个酒店预订系统作为一个项目。
我有一张用于房间、预订和客户的桌子。预订表有以下字段:room_id、customer_id、到达、离开。
我有一个搜索表,您可以在其中选择要预订的房间类型、到达和离开日期。填写表格后,应显示可用房间。
但我必须验证在日期期间是否真的有房间可用。有没有人知道应该在哪个模型中进行验证,因为我认为我必须访问多个模型,我需要房间模型中的房间类型以及预订模型中的到达和离开日期。
谢谢大家
我会做几件事。一种是将您的预订逻辑放在单个模型之外,但要像一个Service
或Manager
对象一样将所有必要的对象作为输入,然后将您的所有业务逻辑包装在一起。
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
他们都没有。
在处理多个资源时,通常最好创建一个不代表资源的单独控制器。这听起来像是其中一种情况。