使用Ecto.Changeset.put_assoc构建默认组

时间:2016-05-08 16:59:36

标签: elixir phoenix-framework

我有一个User和一个Group模型(用户has_many组)。创建新User后,我想为该用户构建三个默认groups。让我们称呼他们为xyz(这将是name)。

我猜Ecto.Changeset.put_assoc是这项工作的正确工具。正确?如何使用它在create函数中创建组?

网络/控制器/ user_controller.ex

[...]
def create(conn, %{"user" => user_params}) do
  changeset = User.changeset(%User{}, user_params)

  case Repo.insert(changeset) do
    {:ok, user} ->
      conn
      |> MyApp.Auth.login(user)
      |> put_flash(:info, "User created successfully.")
      |> redirect(to: user_path(conn, :show, user))
    {:error, changeset} ->
      render(conn, "new.html", changeset: changeset)
  end
end
[...]

网络/模型/ user.ex

defmodule MyApp.User do
  use MyApp.Web, :model
  use Arc.Ecto.Model

  schema "users" do
    field :first_name, :string
    field :last_name, :string

    has_many :groups, MyApp.Group
[...]

网络/模型/ group.ex

defmodule MyApp.Group do
  use MyApp.Web, :model

  schema "groups" do
    field :name, :string

    belongs_to :user, MyApp.User
[...]

1 个答案:

答案 0 :(得分:2)

首先,创建一个新组列表:

groups =
  for name <- ~w(x y z) do
    Group.changeset(%Group{}, %{name: name})
  end

然后,使用Ecto.Changeset.put_assoc/2将其添加到用户更改集的:groups关联中:

changeset =
  User.changeset(%User{}, user_params)
  |> Ecto.Changeset.put_assoc(:groups, groups)

普通Repo.insert(changeset)现在应该使用适当的关联插入所有内容。