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 メソッドがあるかどうか疑問に思いましたか? 終了日が < now であるすべての部屋を取得するために、部屋に 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_onまたはRoom.free_on(1.day.ago)を使用して、特定の日の無料の部屋を取得できるようになりました。予約した部屋に行く方法も追加しました。

于 2012-12-30T23:47:54.787 に答える
0

方法がありexists?ます。クエリに一致するオブジェクトがあるかどうかを確認できます。

于 2012-12-30T23:46:08.627 に答える