0

Когда я пытаюсь изменить в моем MyDB приложение к book я получаю следующее сообщение об ошибке:Как обновить отношение модели в Фениксе?

you are attempting to change relation :people of MyDb.Book, but there is missing data.

Ниже приведены соответствующие фрагменты:

/web/models/book.ex

defmodule MyDb.Book do 
use MyDb.Web, :model 
    schema "books" do 
    field :title, :string 
    field :note, :string 
    many_to_many :people, MyDb.Person, join_through: MyDb.BookPerson 
    timestamps() 
    end 

    @doc """ 
    Builds a changeset based on the `struct` and `params`. 
    """ 
    def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:title, :note]) 
    |> put_assoc(:people, parse_people_ids(params)) 
    end 

    defp parse_people_ids(params) do 
    (params["people_ids"] || []) 
    |> Enum.map(&get_people/1) 
    end 

    defp get_people(id) do 
     MyDb.Repo.get_by(MyDb.Person, id: id) 
    end 
end 

I я могу сохранить связь с этим набором изменений.

/web/controllers/book_controller.ex

def edit(conn, %{"id" => id}) do 
    book = Repo.get!(Book, id)|> Repo.preload(:people) 
    people = Repo.all(Person) |> Enum.map(&{&1.surname, &1.id}) 
    changeset = Book.changeset(book) 
    render(conn, "edit.html", book: book, changeset: changeset, conn: conn, people: people) 
    end 

    def update(conn, %{"id" => id, "book" => book_params}) do 
    book = Repo.get!(Book, id) 
    changeset = Book.changeset(book, book_params) 

    case Repo.update(changeset) do 
     {:ok, book} -> 
     conn 
     |> put_flash(:info, "Book updated successfully.") 
     |> redirect(to: book_path(conn, :show, book)) 
     {:error, changeset} -> 
     render(conn, "edit.html", book: book, changeset: changeset) 
    end 
    end 

/web/templates/book/form.html.eex

<div class="form-group"> 
    <%= label f, "Authors", class: "control-label" %> 
    <%= multiple_select f, :people_ids, @people, class: "form-control" %> 
    <%= error_tag f, :person_id %> 
    </div> 

Комментарий под сообщением об ошибке говорит, что я должен включать ключ начального первичного (ID) наряду с данными, если я хочу, чтобы обновить существующую запись, но я могу Нет.

ответ

0

Необходимо использовать опцию on_replace: :delete в books схеме

schema "books" do 
    field :title, :string 
    field :note, :string 
    many_to_many :people, MyDb.Person, join_through: MyDb.BookPerson, on_replace: :delete 
    timestamps() 
    end 

 Смежные вопросы

  • Нет связанных вопросов^_^