EctoNestedChangeset
This is an experimental package for manipulating nested Ecto changesets.
Installation
Add ecto_nested_changeset
to your list of dependencies in mix.exs
:
def deps do
[
{:ecto_nested_changeset, "~> 0.1.1"}
]
end
See the module documentation of EctoNestedChangeset
for usage examples.
Usage
category = %Category{
posts: [
%Post{
id: 1,
comments: [
%Comment{body: "potato", id: 1},
%Comment{body: "you", id: 2}
],
title: "must"
},
%Post{comments: [], id: 2, title: "young"}
]
}
category
|> Ecto.Changeset.change()
|> append_at(:posts, %Post{title: "Padawan", comments: []})
|> prepend_at([:posts, 0, :comments], %Comment{body: "ecneitaP"})
|> delete_at([:posts, 0, :comments, 1], mode: {:action, :delete})
|> insert_at([:posts, 1], %Post{title: "have"})
|> append_at([:posts, 2, :comments], %Comment{body: "my"})
|> update_at([:posts, 0, :comments, 0, :body], &String.reverse/1)
|> Ecto.Changeset.apply_changes()
%Category{
posts: [
%Post{
comments: [
%Comment{body: "Patience"},
%Comment{body: "you", id: 2}
],
id: 1,
title: "must"
},
%Post{title: "have"},
%Post{
comments: [%Comment{body: "my"}],
id: 2,
title: "young"
},
%Post{title: "Padawan"}
]
}
Example application
There is an example Phoenix application with a dynamic nested LiveView form in
the /example
folder of the repository.
cd example
mix setup
mix phx.server
You can access the list of pet owners at http://localhost:4000.