У меня есть эта модель с массивом строк в качестве одного из столбцов
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"
}
}
Если вы получаете Couldn't find Show without an ID
, это потому, что ничего не приходит params[:show_id]
.
можете ли вы показать содержимое params
, содержимое route.rb и форму, которая ведет к действию create
, пожалуйста.
Что вы делаете с содержимым параметров? Нравятся идентификаторы? @Паскаль
Вы создаете ресурс 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 просто странен в том, как он делает массив строк, и потребовалось некоторое ухищрение.
Ах, sqlite не поддерживает типы массивов. Поэтому вам может потребоваться сериализовать и десериализовать массив самостоятельно. Я не использую sqlite, поэтому не уверен, что это обычный способ.
Я бы не стал беспокоиться об этом, я понял это до того, как возникла эта проблема, ха-ха. В любом случае, я ценю помощь. Мне удалось решить ошибку. После этого не сохранялось show
, чтобы не было эффектов, поэтому я добавил show.save
к логике.
= Показать. найти (параметры [: идентификатор])