KiKi
Adding and removing elements from jsonb field using embedded schema
I’m working on a small project where I’m trying to learn how to use embedded schemas. So I have albums and tracks. Album can have many tracks and they are saved in jsonb field using embedded schema. I want to be able to add new tracks and also, delete them.
In create_track() function, first I get existing tracks, then there is a map with a new track and then they both get merged, put into changeset and album get updated.
def create_track(%Album{} = album, attrs \\ %{}) do
existing_tracks = album.tracks
new_track =
%TrackEmbed{
# this is just to show how TrackEmbed looks, real data comes from attrs
name: "track name"
}
tracks = [new_track | existing_tracks]
changeset = Ecto.Changeset.change(album)
changeset
|> Ecto.Changeset.put_embed(:tracks, tracks)
|> Repo.update()
end
To delete a track, I get existing tracks, find a list index where track I want to delete is and then I remove it from the list and the album gets updated.
def delete_track(%Album{} = album, attrs \\ %{}) do
existing_tracks = album.tracks
# real data comes from attrs here too
existing_track_index = Enum.find_index(existing_tracks, fn x -> x.name == "track name" end)
tracks = List.delete_at(existing_tracks, existing_track_index)
changeset = Ecto.Changeset.change(album)
changeset
|> Ecto.Changeset.put_embed(:tracks, tracks)
|> Repo.update()
end
The code I have here works but here I’m getting an existing list and just adding or removing from it, so I was wondering if there is maybe a better way?
Marked As Solved
dimitarvp
Nothing dramatically better exists, as far I am aware. You could use cast_embed but that doesn’t help you much because you would still need to load the old value of the list and then update it, meaning that put_embed is the better choice here since it assumes the exact same use case.
cast_embed would be a good choice if you were receiving an entirely new list with which overwrites the old one (and usually if that new list is coming from external request).
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








