2016-10-11 2 views
1

In meiner App habe ich eine Beziehung zwischen Shows und Episoden. Shows können viele Episoden haben. Wenn eine Episode zu schaffen Ich bin in der Lage, eine Assoziation zu der Show aufzubauen, indem dies zu tun:Wie man eine zu vielen Assoziationen in Ecto aktualisiert

def create(conn, %{"episode" => episode_params}) do 
    show = Repo.get!(Show, episode_params["show_id"]) 
    changeset = 
     show 
     |> build_assoc(:episodes) 
     |> Episode.changeset(episode_params) 

    case Repo.insert(changeset) do 
     {:ok, _post} -> 
     conn 
     |> put_flash(:info, "Episode created successfully.") 
     |> redirect(to: show_path(conn, :show, show)) 
     {:error, changeset} -> 
     render(conn, "new.html", changeset: changeset) 
    end 
    end 

Wie kann ich am besten Update der Folgen Verein zu einer Show? Das habe ich jetzt.

def update(conn, %{"id" => id, "episode" => episode_params}) do 
    episode = Repo.get!(Episode, id) 
    changeset = Episode.changeset(episode, episode_params) 

    case Repo.update(changeset) do 
     {:ok, episode} -> 
     conn 
     |> put_flash(:info, "Episode updated successfully.") 
     |> redirect(to: episode_path(conn, :show, episode)) 
     {:error, changeset} -> 
     render(conn, "edit.html", episode: episode, changeset: changeset) 
    end 
end 
+0

können Sie nur 'show_id' zu den erlaubten Feldern der' cast' in 'Episode.changeset/2' hinzufügen und lassen Sie den Fremdschlüssel ungültig' show_id' Werte verarbeiten. Gibt es einen Grund, das nicht zu tun? – Dogbert

+0

@Dogbert Du hast recht! Ich lerne immernoch. Vielen Dank. –

Antwort

2

Wenn Sie einige Anforderungen haben wie keine Änderungen an show_id von einigen Aktionen ermöglichen, wäre die einfachste Art und Weise show_id in der Liste der erlaubten Felder in dem Aufruf von cast in Episode.changeset/2 hinzuzufügen, und lassen Sie die Datenbank ungültig behandeln show_id Werte mithilfe von Fremdschlüsseleinschränkungen.

defmodule MyApp.Episode 
    ... 
    def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:show_id, ...]) # add :show_id here 
    end 
end 

und dann übergeben Sie einfach episode_params direkt an changeset sowohl create und update:

def create(conn, %{"episode" => episode_params}) do 
    changeset = Episode.changeset(%Episode{}, episode_params) 
    ... 
end 
def update(conn, %{"id" => id, "episode" => episode_params}) do 
    episode = Repo.get!(Episode, id) 
    changeset = Episode.changeset(episode, episode_params) 
    ... 
end 

Stellen Sie sicher, dass die Migration show_id Feld references(...) mit hinzugefügt oder dem manuellen Konfiguration der Datenbank-Einschränkung hinzugefügt . Etwas wie:

create table(:episodes) do 
    ... 
    add :show_id, references(:shows, on_delete: :nothing) 
    ... 
end 
Verwandte Themen