Я создаю приложение «Ruby on Rails» для кинотеатра и в настоящее время работаю над заказом.Обновление выпадающего меню на основе предыдущего выбора
Пользователь может выбрать количество взрослых мест, детских кресел, мест для студентов и старших мест. Экран имеет много мест, которые хранятся в столике сидений, но пользователь не заказывает определенное место, а количество мест. Выпадающие меню позволяют пользователю выбирать максимум 10 мест для каждого количества (взрослый, ребенок, студент, старший), но если на экране есть 50 мест и 45 из них забронированы, то выпадающие меню ограничены максимум 5. Но моя проблема заключается в том, что этот максимум на каждом выпадающем списке - так что пользователь может выбрать 5 взрослых мест, детские кресла, места для студентов и старшие места.
Я знаю, что могу добавить подтверждение, чтобы на экране было 50 мест, а 45 уже забронированы, и пользователь выбирает 5 взрослых, 5 детей, 5 учеников и 5 старших мест, затем он добавит количества и существующие (5 + 5 + 5 + 5 + всего существующих заказов = 65), чтобы гарантировать, что это не превышает емкость экрана. Но я хочу сделать так, чтобы выпадающее меню обновлялось на основе предыдущего выбора. Так что, если в общей сложности осталось 5 мест для бронирования, а пользователь выбирает 3 взрослых места, выпадающие списки для детей, учеников и старших должно быть ограничено максимум 2.
Может кто-то, пожалуйста, помогите мне сделать это. Я рассмотрел так много ссылок для динамических выпадающих списков, но ни один из них не затрагивает ничего подобного, поскольку они сосредоточены на таких вещах, как страны и государства.
просмотров/заказы/_form.html.erb:
<td>
<%= f.select :adult_seats, '0'..(@booking.showing.screen.remaining_seats > 10 ? 10 : @booking.showing.screen.remaining_seats).to_s %><br>
</td>
<td>
<%= f.select :child_seats, '0'..(@booking.showing.screen.remaining_seats > 10 ? 10 : @booking.showing.screen.remaining_seats).to_s %><br>
</td>
<td>
<%= f.select :senior_seats, '0'..(@booking.showing.screen.remaining_seats > 10 ? 10 : @booking.showing.screen.remaining_seats).to_s %><br>
</td>
<td>
<%= f.select :student_seats, '0'..(@booking.showing.screen.remaining_seats > 10 ? 10 : @booking.showing.screen.remaining_seats).to_s %><br>
</td>
Screen.rb:
class Screen < ActiveRecord::Base
has_many :seats
has_many :showings
has_many :bookings, through: :showings
def remaining_seats
available_seats = seats.count - bookings.sum(:adult_seats)
available_seats = available_seats - bookings.sum(:child_seats)
available_seats = available_seats - bookings.sum(:disabled_seats)
available_seats = available_seats - bookings.sum(:student_seats)
available_seats = available_seats - bookings.sum(:senior_seats)
available_seats = available_seats - bookings.sum(:immortal_seats)
end
end
schema.rb:
create_table "bookings", force: :cascade do |t|
t.integer "user_id"
t.integer "showing_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "adult_seats"
t.integer "child_seats"
t.integer "senior_seats"
t.integer "student_seats"
end
create_table "screens", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "seats", force: :cascade do |t|
t.string "row_letter"
t.integer "row_number"
t.integer "screen_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "showings", force: :cascade do |t|
t.date "show_date"
t.time "show_time"
t.integer "film_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "screen_id"
end
Вы должны иметь общую сторону оставшихся мест вара клиента, а затем ограничить последующие выпадающие на основе выбора. В идеале это вызовет сервер, чтобы проверить, что они все еще доступны или заблокировать бронирование у других людей. –
Итак, как я могу это сделать? Нет необходимости блокировать форму бронирования для других людей, так как система будет доступна только одному человеку за раз. –
Я работаю над образцом для вас. –