Как сохранить вложенную связь «один ко многим» в Rails только для API?

В моем учебном проекте Rails (только API) у меня есть 2 модели, группа и альбом, которые имеют отношение «один ко многим». Когда я пытаюсь сохранить группу с вложенными (уже существующими) альбомами, я получаю следующую ошибку: ActiveRecord::RecordNotFound (Couldn't find Album with ID=108 for Group with ID=). Я использую гем jsonapi-serializer. Ниже моя текущая установка. Любая помощь приветствуется.

Модели

class Group < ApplicationRecord
  has_many :albums
  accepts_nested_attributes_for :albums
end


class Album < ApplicationRecord
  belongs_to :group
end

Контроллер групп#создать

def create
  group = Group.new(group_params)

  if group.save
    render json: GroupSerializer.new(group).serializable_hash
  else
    render json: { error: group.errors.messages }, status: 422
  end
end

Контроллер групп#group_params

def group_params
  params.require(:group)
    .permit(:name, :notes, albums_attributes: [:id, :group_id])
end

Сериализаторы

class GroupSerializer
  include JSONAPI::Serializer
  attributes :name, :notes
  has_many :albums
end


class AlbumSerializer
  include JSONAPI::Serializer
  attributes :title, :group_id, :release_date, :release_date_accuracy, :notes
  belongs_to :group
end

Пример полезной нагрузки JSON

{
  "group": {
     "name": "Pink Floyd",
     "notes": "",
     "albums_attributes": [
       { "id": "108" }, { "id": "109" }
     ]
  }
}

person soultrust    schedule 02.11.2020    source источник


Ответы (1)


Если альбомы уже существуют, то accepts_nested_attributes не нужен. Вы можете сохранить их так:

  Group.new(name: group_params[:name], notes: group_params[:notes], album_ids: group_params[:album_ids])

Вы захотите извлечь альбомы в виде массива при передаче сюда.

person TheGeorgeous    schedule 02.11.2020