ecto_nested_changeset
ecto_nested_changeset copied to clipboard
Helpers for manipulating nested Ecto changesets
EctoNestedChangeset
This is a 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.2.1"}
]
end
Usage
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"}
]
}
Example application
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.
Status
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.