euphbriggs
Ecto embedded schema migration
I have a schema that contains an embedded schema, which I would like to rename a field on. For example:
schema "menu_items" do
field(:plu, :string)
# ...
embeds_many :build_items, BuildItem, on_replace: :delete do
field(:item_id, :string)
# ...
end
end
I want to rename the build_items item_id field to value. Is there a way to do this with an Ecto migration or will I need to create the new field, copy the data over, then delete the old field?
Any pointers are very much appreciated.
Thanks,
Ben
Most Liked
euphbriggs
I posted this question on StackOverflow and here’s the solution that I ended up with. Thanks for pointing me in the right direction. I think I probably would have wasted another day’s worth of time before I even considered writing the SQL directly. Ecto’s really spoiled me. I used to write all my SQL queries/commands and now I rarely need to!
UPDATE menu_items
SET build_items = t.newValue
FROM (WITH temp AS (SELECT id, UNNEST(build_items) b FROM menu_items)
SELECT
id,
array_agg(b - 'item_id' || jsonb_build_object('value', coalesce(b -> 'item_id', b -> 'value'))) AS newValue
FROM temp
GROUP BY id) AS t
WHERE menu_items.id = t.id;
Last Post!
zaljir
Old topic, but still useful. The custom query can be simplified a little:
UPDATE menu_items t1 SET build_items = (
SELECT json_agg(el::jsonb - 'item_id' || jsonb_build_object('value', el -> 'item_id'))
FROM menu_items t2, jsonb_array_elements(t2.build_items) AS el
WHERE t1.id = t2.id
);
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
- #code-sync
- #javascript
- #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
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









