bohdan-shulha

bohdan-shulha

Using belongs_to in an embedded schema to create new records

Hi there.

I have another problem which I can’t fight on myself.

I have a deeply nested schema in my Ecto model. One of the deep inside branches looks like this:

embeds_many :configs, ConfigSpec, on_replace: :delete do
  def changeset(config_spec, attrs) do
    config_spec
    |> cast(attrs, [:target])
    |> cast_assoc(:config,
      required: true,
      with: &PtahServer.DockerConfigs.DockerConfig.changeset/2
    )
    |> validate_required([:target])
  end

  field :target, :string

  belongs_to :config, PtahServer.DockerConfigs.DockerConfig
end

Everything works fine until I want to add a new ConfigSpec.

I have been using the hidden inputs approach with the :configs_sort field, but whenever I click “add an item” I’m getting non-loaded association error on the :config field.

It works perfectly fine if database already has some data (I preload everything what’s required), fails only for items being created at the moment.

** (ArgumentError) using inputs_for for association `config` from `PtahServer.Services.Service.ServiceSpec.TaskTemplate.ContainerSpec.ConfigSpec` but it was not loaded. Please preload your associations before using them in inputs_for

What will be the right approach here?

Form is really deeply nested. :slightly_smiling_face:

stack[services][0][spec][task_template][container_spec][configs][0][config]

stack[services] is the list of Ecto models, whereas spec and everything inside (except the config field) are embedded schemas.

For the record, here is my PR: https://github.com/ptah-sh/ptah_server/pull/87

The related code belongs to lib/ptah_server_web/live/stack_live/components/service_component.html.heex

I have tried to manually override values in the changeset, but no luck - embedded records can be created, but the entity defined via belongs_to is not created.

First Post!

sodapopcan

sodapopcan

You need to build an empty association for every new one you want. For example:

defmodule Bar do
  schema "bars" do
    belongs_to :foo, Foo
  end
end

defmodule Foo do
  schema "foos" do
    has_many :bars, Bar
  end

  def append_empty_bar(changeset) do
    new_bar = %Bar{}
    current_bars = Ecto.Changeset.get_assoc(changeset, :bars) # in your case, `get_embed`
    updated_bars = current_bars ++ [new_bar]

    Ecto.Changeset.put_assoc(:bars, updated_bars) # or in your case, `put_embed`
  end
end

# In some context function:
changeset =
  Foo.changeset()
  |> Foo.append_new_bar()

I wouldn’t necessarily call this exemplary code, I just wanted to make it as clear as I could (apologies if I failed here).

You should take a look at this lib: ecto_nested_changeset.

Where Next?

Popular in Questions Top

fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
vac
Hi, I’m quite new in Elixir and I’m trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and I...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: The documentation above suggests that while ...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
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
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New

Other popular topics Top

danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 29603 241
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
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
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement