travisf

travisf

Ecto 3 put_embed not accepting structs?

In upgrading from Ecto 2 to Ecto 3 I’m dealing with a failing test. If I use ExMachina build(:address) I’ll get an error trying to put_embed/3:

** (ArgumentError) unknown field `:__meta__` in %Orders.Schemas.InlineAddress{address: #Ecto.Association.NotLoaded<association :address is not loaded>, address_id: nil, city: nil, country_code: nil, delivery_instructions: nil, full_name: nil, id: nil, inserted_at: nil, line1: nil, line2: nil, override: nil, phone_number: nil, sap_id: nil, state_or_region: nil, type: nil, updated_at: nil, version: 1, zip_code: nil}
     code: exec(order: order, send_email: send_email_mock, send_csv: send_csv_mock, csv: true)
     stacktrace:
       (ecto 3.6.2) lib/ecto/changeset.ex:1225: Ecto.Changeset.put_change/7
       (stdlib 3.17) maps.erl:410: :maps.fold_1/3
       (ecto 3.6.2) lib/ecto/changeset.ex:396: Ecto.Changeset.change/2
       (ecto 3.6.2) lib/ecto/changeset/relation.ex:198: Ecto.Changeset.Relation.do_change/4
       (ecto 3.6.2) lib/ecto/changeset/relation.ex:326: Ecto.Changeset.Relation.single_change/5
       (ecto 3.6.2) lib/ecto/changeset/relation.ex:165: Ecto.Changeset.Relation.change/3
       (ecto 3.6.2) lib/ecto/changeset.ex:1213: Ecto.Changeset.put_change/7
       (ecto 3.6.2) lib/ecto/changeset.ex:1423: Ecto.Changeset.put_relation/5
       (packsize_data 0.0.1) ...accounting/schemas/vendor_po.ex:52: Accounting.VendorPO.changeset/2

vendor_po.ex referenced looks like:

  def changeset(%VendorPO{} = po, attrs) do
    po
    |> cast(attrs, ~w[customer_po_number]a)
    |> put_embed_from_params(:shipping_address)
  end

  defp put_embed_from_params(changeset, key) do
    put_embed(changeset, key, changeset.params["#{key}"])
  end

Changing the test to params_for(:address) works. I don’t see anything in the Ecto docs that indicates something changed, to the contrary the documentation for put_assoc/3 states:

changesets or structs - when a changeset or struct is given, they are treated as the canonical data and the associated data currently stored in the association is ignored.

First Post!

dimitarvp

dimitarvp

Nothing comes to mind but have you tried first updating only to Ecto 3.0 just to make sure the upgrade is as minimal as possible?

Last Post!

travisf

travisf

I just checked I’m on the latest of Exmachina, I’ll look into what @dimitarvp suggested at the moment Ecto looks locked at 3.6.2.

Where Next?

Popular in Questions Top

vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs &amp; Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 131117 1222
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 31586 112
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 42716 114
New

We're in Beta

About us Mission Statement