This is a package for manipulating nested Ecto changesets.
Add ecto_nested_changeset
to your list of dependencies in mix.exs
:
def deps do
[
{:ecto_nested_changeset, "~> 0.2.1"}
]
end
The primary use case of this library is the manipulation of Ecto changesets used as a source for dynamic, nested forms in Phoenix LiveView.
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"}
]
}
There is an example Phoenix application with a dynamic nested LiveView form in
the /example
folder of the repository.
git clone https://github.com/woylie/ecto_nested_changeset.git
cd ecto_nested_changeset/example
mix setup
mix phx.server
Note that Postgres needs to be running to use the application.
You can access the application at http://localhost:4000.
This library has a very narrow purpose, which means that even though it is young, it is unlikely that new functionality is going to be added or that the API is going to change. Should you miss something, though, don't hesitate to open an issue. Any issues and problems that may arise will be dealt with swiftly.