Я пытаюсь улучшить SQL для следующего графика:Улучшение планирования/бронирования SQL запрос в рельсах
Это выглядит примерно так:
- @users.each do |user|
- @dates.each do |date|
%td
- Booking.where(user: user, date: date).each do |booking|
= booking.shift_time
@users
состоит из пользователей присутствующих в таблице.
@dates
состоит из дат: начало недели -> конец недели
Очевидно, что этот код отстой, потому что запрос обжигают для каждой даты, бронирование и пользователем. Наличие более чем нескольких пользователей займет много времени для загрузки страницы.
Как я могу улучшить этот запрос? Возможно ли даже получить все эти данные из базы данных, используя один (большой) запрос? Я использую PostgreSQL, если это имеет значение.
Одно из предложений заключается в том, что я получаю все заказы, которые находятся между @dates
и группируются по датам. Но это означает, что мне придется заменить несуществующие заказы на определенную дату и пользователя значением NULL
, но я не знаю, как я смогу это сделать.
Вот выход SQL:
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 1 AND "bookings"."date" = '2015-03-09'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 1 AND "bookings"."date" = '2015-03-10'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 1 AND "bookings"."date" = '2015-03-11'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 1 AND "bookings"."date" = '2015-03-12'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 1 AND "bookings"."date" = '2015-03-13'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 1 AND "bookings"."date" = '2015-03-14'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 1 AND "bookings"."date" = '2015-03-15'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 2 AND "bookings"."date" = '2015-03-09'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 2 AND "bookings"."date" = '2015-03-10'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 2 AND "bookings"."date" = '2015-03-11'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 2 AND "bookings"."date" = '2015-03-12'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 2 AND "bookings"."date" = '2015-03-13'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 2 AND "bookings"."date" = '2015-03-14'
SELECT "bookings".* FROM "bookings" WHERE "bookings"."user_id" = 2 AND "bookings"."date" = '2015-03-15'
Вы понимаете, что делаете запросы users.count * dates.count вместо одного запроса (если только вы не сделали специальные измерения, о которых я знаю, вы этого не сделали, учитывая вопрос). – iced
@iced Да, я знаю. Вот почему я прошу о помощи в том, как улучшить это. – karlingen