我想开发一个酒店预订系统作为我大学的项目。
我有一张房间,预订和顾客的桌子。预订表包含以下字段:room_id,customer_id,到达,离开。
我有一个搜索表单,您可以在其中选择要预订的房间类型,到达和离开日期。填写表格后,应显示可用房间。
但我必须验证日期期间房间是否真的可用。有没有人知道验证应该在哪个模型中发生,因为我认为我必须访问几个模型,我需要房间模型的房型和预订模型的到达和离开日期。
感谢大家
答案 0 :(得分:2)
我会做几件事。一个是将您的预留逻辑放在单个模型之外,但是将其作为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
答案 1 :(得分:0)
他们都不是。
通常最好在处理多个资源时创建一个不代表资源的独立控制器。这听起来像是其中一种情况。