Невозможно вернуть элементы массива из массива строк, используя переменные экземпляра

У меня есть эта модель с массивом строк в качестве одного из столбцов

  create_table "shows", force: :cascade do |t|
    t.time "st"
    t.time "ed"
    t.integer "money"
    t.string "av_seats", default: "--- []\n"
    t.string "oc_seats", default: "--- []\n"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "theatre_id"
    t.integer "screen_id"
    t.integer "movie_id"
    t.index ["movie_id"], name: "index_shows_on_movie_id"
    t.index ["screen_id"], name: "index_shows_on_screen_id"
    t.index ["theatre_id"], name: "index_shows_on_theatre_id"
  end

Я пытаюсь сослаться на av_seats и oc_seats в контроллере другой модели с помощью этой логики.

def create
    @booking = Booking.new(booking_params)
    @av_seats = Show.find(params[:show_id]).pluck(:av_seats)
    @oc_seats = Show.find(params[:show_id]).pluck(:oc_seats)

    if @booking.save
      if @av_seats.include? @booking.seat
        @oc_seats << @booking.seat
        @av_seats.delete @booking.seat
      end
      render json: @booking, status: :created, location: @booking

По сути, предполагается переместить элемент из одного массива в другой и удалить тот же элемент из предыдущего массива на основе ввода.

"status": 404,
    "error": "Not Found",
    "exception": "#<ActiveRecord::RecordNotFound: Couldn't find Show without an ID>",

Я пробовал использовать метод pluck заранее, а затем пытался использовать find для элемента, но, возможно, я тоже делаю это неправильно.

    @av = Show.pluck(:show_id, :av_seats)
    @oc = Show.pluck(:show_id, :oc_seats)

    @av_seats = Show.find(@av)
    @oc_seats = Show.find(@oc)
# routes.rb

Rails.application.routes.draw do
  resources :movies
  resources :bookings
  resources :shows
  resources :screens
  resources :theatres
  resources :users
end

Вот как обычно выглядит форма. Это API, поэтому никаких просмотров, только чистый JSON.

{
    "booking": {
        "user_id": 1,
        "show_id": 2,
        "screen_id": 2,
        "seat": "A5"
    }
}

= Показать. найти (параметры [: идентификатор])

dbugger 22.03.2022 21:55

Если вы получаете Couldn't find Show without an ID, это потому, что ничего не приходит params[:show_id].

Alter Lagos 22.03.2022 22:11

можете ли вы показать содержимое params, содержимое route.rb и форму, которая ведет к действию create, пожалуйста.

Pascal 22.03.2022 23:31

Что вы делаете с содержимым параметров? Нравятся идентификаторы? @Паскаль

Lazlo 23.03.2022 05:55
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
4
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы создаете ресурс Booking. Информация (:show_id) находится под ключом :bookings в ваших параметрах.

Я предполагаю, что вы получили следующий метод на BookingsController

def booking_params
  params.require(:booking).permit(:show_id, :user_id, :seat, :screen_id)
end

?

Если у вашего Booking правильно настроена ассоциация

class Booking < ApplicationRecord
  belongs_to :show
end

Затем вы можете получить доступ к шоу следующим образом:

booking = Booking.new(booking_params)
show = booking.show

Если ассоциация не настроена, вы можете использовать

show = Show.find(params[:booking][:show_id])
# or
show = Show.find(booking_params[:show_id]) # not _params_

Поскольку объект шоу загружается в любом случае, вы можете просто получить прямой доступ к av_seats и oc_seats

show.av_seats
show.oc_seats

pluck — это оптимизация, при которой из БД извлекаются только те столбцы, которые вы срывать.

Вероятно, вы захотите изменить столбцы xx_seats на тип string[]array: true в вашей миграции).

После того, как вы измените содержимое массива(ов) мест, вам необходимо сохранить запись шоу.

О, хорошо, да, я понимаю, что ты имеешь в виду. Мне удалось заставить его окончательно устранить ошибку, и он отлично копирует символы. Но почему-то не удаляет из oc_seats. Кроме того, они уже являются строками, sqlite3 просто странен в том, как он делает массив строк, и потребовалось некоторое ухищрение.

Lazlo 23.03.2022 19:20

Ах, sqlite не поддерживает типы массивов. Поэтому вам может потребоваться сериализовать и десериализовать массив самостоятельно. Я не использую sqlite, поэтому не уверен, что это обычный способ.

Pascal 24.03.2022 10:45

Я бы не стал беспокоиться об этом, я понял это до того, как возникла эта проблема, ха-ха. В любом случае, я ценю помощь. Мне удалось решить ошибку. После этого не сохранялось show, чтобы не было эффектов, поэтому я добавил show.save к логике.

Lazlo 24.03.2022 22:33

Другие вопросы по теме