2016-05-23 69 views
0

我正在從我的數據庫中檢索某些房間。房間屬於酒店。我只收回屬於距離所需區域很近(20公里)的酒店的房間,我也在檢查房間是否有合適的容量。這使我有一套房間(有時每個酒店都有很多房間)。我只想渲染一個符合每個酒店標準的房間:最便宜的room_price。我怎樣才能做到這一點 ?只爲每家酒店提供價格最低的房間

這裏是我的方法看起來像到目前爲止

def find_hotels 
    # hotels near query 
    @hotels = Hotel.near(params[:place], 20) 
    number_of_people = params[:adults_number].to_i + params[:children_number].to_i 
    # rooms with the right capaciy 
    # rooms with the best price 
    @rooms = Room.where(hotel_id: @hotels.map(&:id)).where("capacity >= :number_of_people", {number_of_people: number_of_people}) 
    end 

回答

0

這個怎麼樣?

def find_hotels 
    # hotels near query 
    @hotels = Hotel.near(params[:place], 20) 
    number_of_people = params[:adults_number].to_i + params[:children_number].to_i 
    # rooms with the right capaciy 
    # rooms with the best price 
    list_of_rooms = @hotels.inject({}){|result, hotel| result[hotel.id] = cheapest_room_id(hotel.id, number_of_people); result} 
    end 

def cheapest_room_id(hotel_id, number_of_people) 
    return Room.where(hotel_id: hotel_id).where("capacity > ?", number_of_people).order("room_price ASC").first.id 
end 

變量list_of_rooms將包含一個散列以這種形式:

{ hotel_1 => room_123, hotel_2 => room_44, hotel_3 => room_666 } 

這裏的一切是一個ID。 PS:它應該工作。

+1

這只是給你所有沒有最便宜的房間最便宜的_room每家酒店... –

+0

@DavidGeismar對不起,看錯你的問題。我更新了我的答案。 –

+0

find_by返回單個實例,但否則它運行良好,謝謝 –

1

我想你可能會認爲在酒店裏可能有不止一個房間的最低價格相等。

無論如何,如果你有100家酒店要考慮,那麼你可能會發現每個酒店運行一個查詢來找到最便宜的房間是不可接受的。

如果是這樣,您可能需要深入SQL來優化搜索(並且還可以通過組合查詢來查找酒店和查詢來順利查找房間)。

像這樣的東西應該是高性能的。

def find_hotels 
    # hotels near query 
    number_of_people = params[:adults_number].to_i + params[:children_number].to_i 
    # rooms with the right capaciy 
    # rooms with the best price 
    @rooms = Room.where(hotel: Hotel.near(params[:place], 20)). 
       where("capacity >= :number_of_people", {number_of_people: number_of_people}). 
       where("not exists (select null 
            from rooms r2 
            where r2.hotel_id = rooms.hotel_id and 
              r2.capacity >= :number_of_people and 
              r2.room_price <= rooms.room_price and 
              r2.id   <= rooms.id)", , {number_of_people: number_of_people}) 
end 

它找到的房間,在所需的容量和更便宜的價格在同一家酒店沒有另一個。事實上,假設您只希望每個酒店返回一個單人房間,情況會更進一步。

如果希望所有客房的最低費率返回,使用:

def find_hotels 
    # hotels near query 
    number_of_people = params[:adults_number].to_i + params[:children_number].to_i 
    # rooms with the right capaciy 
    # rooms with the best price 
    @rooms = Room.where(hotel: Hotel.near(params[:place], 20)). 
       where("capacity >= :number_of_people", {number_of_people: number_of_people}). 
       where("not exists (select null 
            from rooms r2 
            where r2.hotel_id = rooms.hotel_id and 
              r2.capacity >= :number_of_people and 
              r2.room_price < rooms.room_price)", , {number_of_people: number_of_people}) 
end 
+0

真棒查詢技能。 ;) –

+1

@RareFever但是可以說盡管效率還不如它,但在合理的Rails-ey方法的約束下,ti可能會這樣做。 :) –