2012-12-30 2 views
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 

내가 궁금 : 나는 작동하지 않는 것 다음을 시도? 나는 마지막 방이 < 인 모든 방을 얻기 위해 객실에 LEFT JOIN을 강요했지만 그 중 하나도 작동하지 않았습니다.

많은 도움을 주셔서 감사합니다.

+0

나는 지저분한 해결 방법을 가지고있다 : 방이 예약되어 있다면 모든 방의 루프를 돌리고 각 방을 반복하고 종료일을 확인한다. 그것은 작동하지만 예쁜 것은 아닙니다. 물론 이것은 간단한 왼쪽 조인 SQL 쿼리입니다! – wkdshot

답변

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)를 사용할 수 있습니다. 나는 또한 예약 된 방에 도착하는 방법을 추가했습니다.

+0

이것은 또한 좋은 대답입니다. 명명 된 범위는 활용도가 낮습니다. 또한, 나를 뽑아내는 방법을 소개하는 명성. 전에는 보지 못했습니다. :) – jxpx777

+0

안녕하세요, 답변 주셔서 감사합니다! :) – wkdshot

0

exists? 방법이 있습니다. 쿼리와 일치하는 개체가 있는지 확인할 수 있습니다.

관련 문제