How to chain Ecto.Multi.insert_all calls

Hello all,

I have an Ecto.Multi chain that creates a list of chat groups with Multi.insert_all, and then creates chats_users join table records for all of those chat groups.

Unfortunately, it appears the first insert_all call only returns a tuple with the number of records created. e.g. {16, nil}

Is there a way to get a list of the all the records to iterate through them?

Multi.new()
|> Multi.insert_all(:chats, Chat,
      # chat for every team, and every team + org members
      chats = Enum.reduce(cohort.teams, [], fn team, chat_list ->
        chat_1 = %{
          name: "#{team.name}", 
          type: "Team",
          team_id: team.id,
          inserted_at: now,
          updated_at: now}
        chat_2 = %{
          name: "#{cohort.organization.name} + #{team.name}", 
          type: "Cohort Team", 
          parent_organization_id: cohort.organization.parent_organization_id,
          organization_id: cohort.organization_id,
          cohort_id: cohort.id,
          team_id: team.id,
          inserted_at: now,
          updated_at: now}
        chat_list
        |> List.insert_at(-1, chat_1)
        |> List.insert_at(-1, chat_2)
      end))
    |> Multi.insert_all(:chats_users, ChatUser,
      fn %{chats: chats} ->
      ## The above has a tuple {16, nil} and not the list of records

You can see the final line fn %{chats: chats} -> ends up with {16, nil} and not with a list of the chats.

Appreciate any help, thank you!

1 Like

Maybe this would help Ecto.Multi insert_all - how to get new ids?

2 Likes