Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何在EXTO中更新一对多关联_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir 如何在EXTO中更新一对多关联

Elixir 如何在EXTO中更新一对多关联,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,在我的应用程序中,节目和剧集之间有一对多的关系。节目可以有很多集。在制作一集时,我可以通过以下方式与节目建立关联: def create(conn, %{"episode" => episode_params}) do show = Repo.get!(Show, episode_params["show_id"]) changeset = show |> build_assoc(:episodes) |> Episode

在我的应用程序中,节目和剧集之间有一对多的关系。节目可以有很多集。在制作一集时,我可以通过以下方式与节目建立关联:

  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
我怎样才能最好地将剧集关联更新为一个节目?这就是我现在拥有的

  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

除非您有一些要求,例如不允许从某些操作更改
show\u id
,否则最简单的方法是将
show\u id
添加到
inception.changeset/2
中对
cast
的调用中允许的字段列表中,并让数据库使用外键约束处理无效的
显示\u id

defmodule MyApp.Episode
  ...
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:show_id, ...]) # add :show_id here
  end
end
然后只需在
create
update
中将
剧集参数直接传递到
changeset

def create(conn, %{"episode" => episode_params}) do
  changeset = Episode.changeset(%Episode{}, episode_params)
  ...
end
确保您的迁移添加了
使用
引用(…)
显示\u id
字段,或者手动添加了数据库约束。比如:

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

您只需将
show_id
添加到
剧集.changeset/2
中的
cast
的允许字段中,并让外键约束处理无效的
show_id
值。有什么理由不这么做吗?@Dogbert你说得对!还在学习。非常感谢你。
create table(:episodes) do
  ...
  add :show_id, references(:shows, on_delete: :nothing)
  ...
end