Struggling to update embedded schemas

Hi there, folks. I’m struggling with this issue for quite some time… It’s with Ecto embedded schemas…

Consider the following:
Orders embeds many Items.

I have the following on the Order schema:
embeds_many :items, Schemas.Order.Item, on_replace: :delete

In the same Schema, I have created the following function:

  @doc """
  Updates a given `t:OPS.DataBase.Schemas.Order/0` in the
  database. (Permits the update of the "items" embeded schema)
  """
  @spec update_with_items(t(), map(), list(Schemas.Order.Item.t())) :: response()
  def update_with_items(order, params, items) do
    order
    |> cast(params, @update_params)
    |> put_embed(:items, items)
    |> Repo.update()
  end

So for a given Order, I can update some parameters on it, but also can update the list of Items.
It does update the parameters, but will not update the list of items.

Here’s a example of the list of items I’m passing to the function:

[
  %OPS.DataBase.Schemas.Order.Item{
    id: "4e903100-07ff-4096-b0f0-8bc88c50c630",
    image: "image",
    name: "item 1",
    picked: false,
    price: nil,
    product_id: 987654,
    quantity: 2,
    supplier_store_id: "64ac2f41-dcf4-43d1-82b7-da994c99ba57",
    title: nil,
    variant_id: 99999,
    variant_title: "variant_title",
    vendor: "vendor"
  },
  %OPS.DataBase.Schemas.Order.Item{
    id: "b8972930-9d94-470a-90ad-abcf67c3c57e",
    image: "image",
    name: "item 2",
    picked: false,
    price: nil,
    product_id: 657321,
    quantity: 2,
    supplier_store_id: "454545454545",
    title: nil,
    variant_id: 88888,
    variant_title: "variant_title",
    vendor: "vendor"
  }
]

This is during my tests, and it’s not updating the Items of an Order.
Note that those items contains the ID already, I don’t think those matter to be honest, but I’m about to remove them to see if it works.

I’m kinda clueless here, any help/tip will be welcome.

Thank you!

1 Like

Passing a list including ids should work fine. I haven’t had any trouble doing that. What is the output of the function? If it’s not raising an error, my first guess would be this behavior described in the docs:

If the embed has no changes, it will be skipped.