2016-05-23 2 views
0

Я забираю определенный набор комнат из своей базы данных. В номере есть комната. Я извлекаю только номера, принадлежащие гостинице, которая близка (20 км) к запрашиваемой зоне, я также проверяю, имеет ли комната подходящую емкость. Это дает мне определенный набор номеров (иногда много комнат для каждого отеля). Id нравится отображать только одну комнату, которая соответствует критериям для каждого отеля: одна с самыми дешевыми 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, вероятно, это сделало бы. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^