Ruby on Rails无需预订即可查找记录

时间:2012-12-30 23:20:03

标签: ruby-on-rails database-design activerecord

我正在建立一个酒店预订系统。我有用户,房间和预订模型。我使用关联链接如下:(注意,伪代码)

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;现在,但这也没有用。

非常感谢你的帮助!

2 个答案:

答案 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_onRoom.free_on(1.day.ago)获取特定日期的免费房间。我还添加了进入预订房间的方法。

答案 1 :(得分:0)

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