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.