Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Как реализовать структуру?

Здравствуйте, подскажите пожалуйста, как лучше построить структуру. Вопрос скорее логический, сам пока не понимаю правильно ли думаю. В данный момент форма для добавления сеанса в кинотеатре выглядит таким образом.

До этого решал другие вопросы и считал что тут пока все нормально, но сейчас понимаю что структура скорее всего не правильная. В данный момент при нажатии на кнопку "Create film session" создается одна запись в БД с начальной датой проката фильма в кинотеатре, и конечной. На этом сеансе можно забронировать место:

Но такая логика не правильная, ведь каждый день от начала проката фильма в кинотеатре и до конца проката должен быть новый (чистый) сеанс, с соответствующей датой, что позволит пользователям бронировать место на соответствующий день. И выходит, что при добавлении нового сеанса, как на первом скриншоте в БД должна добавляться не 1 запись а например 30 (с 1 по 30 число), и в каждой из них другая дата.(На этом скриншоте видно, что у пользователя должна быть возможность забронировать место выбрав любом из доступных дней) Возникает вопрос, не говнокод ли это?) Ведь если сеансов будет много, то записей в БД будет тоже много. И второй вопрос куда более важный: при создании сеанса (как на первом скриншоте) будет ещё возможность выбора времени (9.00, 12.00, 14.00 и тд) с помощью чекбоксов. Выходит, что например для сеанса, который поступает в прокат 15.05.2016 будет будет допустим выбрано время 10.00, 16.00 и 21.00, что приведет сразу к 3 записям в БД. А если такой фильм будет идти 10 дней в прокате, то записей в БД будет сразу 300, и это только для одного фильма. А если фильмов будет 5 или 10..) В общем подскажите пожалуйста как лучше реализовать такое, а то мне опыта не хватает, и с подобными задачами сталкиваюсь впервые.


Ответ

Нет, с записью фильма и точками начала и конца проката у вас все нормально. Это хорошо, что запись не дублирована и не повторяет одну и ту же информацию по 30 раз (которую еще при редактировании нужно сносить и по-новой вставлять).
Другое дело, что под бронирование вам нужна отдельная таблица/модель, где каждая запись соответствует одному факту бронирования (фильм, дата, сеанс/час, кинотеатр, место в зале). Причем весь набор данных, во-первых должен быть уникальным с одной стороны, т.е. с другой не выходить за границы проката фильма, которую вы держите в дополнительной таблице/модели.
Я бы реализовывал эти ограничения через валидацию на уровне модели. Во-первых уникальная валидация на набор (фильм, день, сеанс, кинотеатр, место). Что-нибудь вроде
validates :film_id, uniqueness: {scope: [:book_at, ... , :seat_id]}
Во-вторых валидация на вхождение даты в выбранный интервал, нечто вроде
validates :book_at_in_intrval
Где book_at_in_intrval - метод проверки вхождения даты в интервал проката.

Комментариев нет:

Отправить комментарий