我有一个User
和一个Group
模型(用户has_many组)。创建新User
后,我想为该用户构建三个默认groups
。让我们称呼他们为x
,y
和z
(这将是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
[...]
答案 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)
现在应该使用适当的关联插入所有内容。