2016-10-11 14 views
1

私のアプリでは、ショーとエピソードの間に1対多の関係があります。ショーは多くのエピソードを持つことができます。エピソードを作成するときに、私はこれを行うことによって、ショーに関連付けを構築することができる午前:Ectoの1対多の関連付けを更新するには

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 

どのように私は最高のショーにエピソードの関連付けを更新することができますか?これは今私が持っているものです。あなたには、いくつかのアクションからshow_idへの変更を許可しないようないくつかの要件がない限り

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

:ような何か。それをしない理由がありますか? – Dogbert

+0

@Dogbertあなたは正しいです!まだ学んでいる。どうもありがとうございました。 –

答えて

2

、最も簡単な方法は、Episode.changeset/2castへの呼び出しで許可されるフィールドのリストにshow_idを追加すること、およびデータベースが不正処理させるだろうshow_idの値は、外部キー制約を使用しています。

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

してからちょうどcreateupdateの両方にchangesetに直接episode_paramsを渡す:

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 

あなたの移行がreferences(...)を使用してshow_idフィールドを追加したり、手動でデータベースの制約を追加したことを確認してください。あなただけの `Episode.changeset/2 'で` cast`の許可フィールドに `show_id`を追加して、外部キー制約が無効` show_id`値を処理させることができ

create table(:episodes) do 
    ... 
    add :show_id, references(:shows, on_delete: :nothing) 
    ... 
end 
関連する問題