2016-10-11 3 views
1

내 앱에서는 프로그램과 에피소드간에 일대일 관계가 많습니다. 프로그램에 에피소드가 여러 개있을 수 있습니다. 에피소드를 만들 때 나는이 작업을 수행하여 쇼에 연결을 구축 할 수 있어요 :Ecto에서 일대 다 관계를 업데이트하는 방법

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

@ 도그 버트 네가 맞아! 아직도 배우기. 고맙습니다. –

답변

2

, 가장 간단한 방법은 Episode.changeset/2에서 cast에 대한 호출에 허용 필드 목록에 show_id을 추가 할 수 있으며, 데이터베이스가 무효 처리 할 것 show_id 값은 외래 키 제약 조건을 사용합니다.

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

후 단지 두 createupdatechangeset에 직접 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 필드를 추가하거나 수동으로 데이터베이스 제약 조건을 추가했는지 확인 . 당신은 단지`추가 show_id``Episode.changeset/2`에서`cast`의 허용 필드 및 외래 키 제약 조건이 무효`show_id` 값을 처리 할 수 ​​

create table(:episodes) do 
    ... 
    add :show_id, references(:shows, on_delete: :nothing) 
    ... 
end 
관련 문제