lou00011

lou00011

Required validation still failing after put_assoc

Jump off point, same problem, but this solution isn’t working for me.

I have a many_to_many association. Even after getting put_assoc right, the error field for that many to many is still there.

This is the IO.inspect result of the changeset

#Ecto.Changeset<
  action: nil,
  changes: %{
    event_id: 1,
    languages: [
      #Ecto.Changeset<
        action: :insert,
        changes: %{id: 1, value: "Cree"},
        errors: [],
        data: #DeAboriginal.Data.Language<>,
        valid?: true
      >,
      #Ecto.Changeset<
        action: :insert,
        changes: %{id: 2, value: "Algonquin"},
        errors: [],
        data: #DeAboriginal.Data.Language<>,
        valid?: true
      >,
      #Ecto.Changeset<
        action: :insert,
        changes: %{id: 3, value: "Miqmaq"},
        errors: [],
        data: #DeAboriginal.Data.Language<>,
        valid?: true
      >,
      #Ecto.Changeset<
        action: :insert,
        changes: %{id: 4, value: "Ojibwe"},
        errors: [],
        data: #DeAboriginal.Data.Language<>,
        valid?: true
      >
    ],
    name: "edede"
  },
  errors: [
    languages: {"is invalid", [validation: :assoc, type: {:array, :map}]}
  ],
  data: #DeAboriginal.Data.Activity<>,
  valid?: false
>

This is the function that generates the above inspect

  def create_activity(attrs \\ %{}) do
    language_map = Enum.map(attrs["languages"],
                          fn x -> x
                                  |> get_language!()
                                  |> fn y -> %{id: y.id, value: y.value} end.()
                          end)

    %Activity{}
    |> Activity.changeset(attrs)
    |> Ecto.Changeset.put_assoc(:languages, language_map)
    |> IO.inspect()
    |> Repo.insert()
    end

And this is the function upstream of the that, which is the :create

  def create(conn, %{
    "activity" => activity,
    "application_id" => application_id,
    "event_id" => event_id,
  }) do

    case Data.create_activity(activity) do
      {:ok, struct} -> conn
       |> put_flash(:info, "#{struct.name} created!")
       |> redirect(to: Routes.application_event_activity_path(conn, :new, application_id, event_id))
    end
  end

This is the :new

  def new(conn, %{
    "application_id" => app_id,
    "event_id" => event_id
  }) do

    changeset = Data.Activity.changeset(%Data.Activity{
      languages: []
    }, %{})

    languages = Data.list_language()
    render(conn, "new.html",
      activity: changeset,
      application_id: app_id,
      event_id: event_id,
      languages: languages
      )
  end

Also is there a comprehensive Ecto guide out there specific with dealing with the relationships? I feel this association stuff all over the place and everyone that writes about it have their own way of working around it.

First Post!

fuelen

fuelen

Hello,
Perhaps, that’s because Activity.changeset has put errors into :languages key. I think you have to remove code related to :languages from that function, because you handle them explicitly.
Also, removing "languages" key from attrs may help.

Last Post!

lou00011

lou00011

I have one more question regarding associations.

The table language is a lookup table and should not be inserted into. I want associations between activity and language to be build against existing rows in the language table.

My problem is that somehow put_assoc function insists on inserting into that table. I stopped this at the DB end using a unique index, but I cannot tell it to use the put_assoc just as a clue for my associative entity/schema.

Where Next?

Popular in Questions Top

ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
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
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New

Other popular topics Top

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
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44139 214
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

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement