我正在建立一个酒店预订系统。我有用户,房间和预订模型。我使用关联链接如下:(注意,伪代码)
User has_many Reservations
User has_many Rooms, through Reservations
Room has_many Reservations
Room has_many Users, through Reservations
Reservation belongs_to Users
Reservation belongs_to Reservations
一切正常,例如我可以列出用户的预订和房间。现在我需要列出所有当前未预订的房间。我尝试过以下似乎不起作用的内容:
reservations = Reservation.where('start > ? AND end < ?', Time.now, Time.now).select('room_id')
if reservations.empty?
@rooms = Room.all
else
@rooms = Room.where('id not in (?)',
reservations)
end
我想知道是否有一个ActiveRecord方法可以帮我吗?我试图在房间强制LEFT JOIN以获得所有房间的结束日期&lt;现在,但这也没有用。
非常感谢你的帮助!
答案 0 :(得分:1)
究竟什么都行不通?我建议你创建一个on
范围来过滤所有在给定日期都有效的预订。然后,您可以使用pluck
获取一系列房间ID,然后自己获取房间。
代码看起来像(警告,从我的头顶写,没有经过测试):
class Reservation < ActiveRecord::Base
scope :on, lambda {|day = Date.today| where('start > ? AND end < ?', day, day) }
end
class Room < ActiveRecord::Base
def self.free_on(day = Date.today)
reserved_room_ids = Reservation.on(day).pluck('DISTINCT room_id')
where('id NOT IN (?)', reserved_room_ids)
end
def self.reserved_on(day = Date.today)
reserved_room_ids = Reservation.on(day).pluck('DISTINCT room_id')
where(:id => reserved_room_ids)
end
end
现在,您可以使用Room.free_on
或Room.free_on(1.day.ago)
获取特定日期的免费房间。我还添加了进入预订房间的方法。
答案 1 :(得分:0)
有exists?
方法。它将允许您查看是否有任何与查询匹配的对象。