0

我正在制作酒店预订系统。我有用户、房间和预订的模型。我使用关联来链接如下:(注意,伪代码)

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 以获取结束日期 < 现在的所有房间,但这也不起作用。

非常感谢您的帮助!

4

2 回答 2

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_onRoom.free_on(1.day.ago)获取某一天的免费房间。我还添加了进入预订房间的方法。

于 2012-12-30T23:47:54.787 回答
0

exists?方法。它将允许您查看是否有任何与查询匹配的对象。

于 2012-12-30T23:46:08.627 回答