hudsonbay

hudsonbay

Phoenix controller and views for bulk insert

Hi, I am trying to create a POST endpoint in Phoenix that will receive an array of maps %{} and I need to insert all of that data into a database as a bulk insertion.

It would be receiving something like this:

entries = [                                                                                                                                   
     %{name: "Frank", age: 23},                                                        
     %{name: "John", age: 24}                                                                                               
   ]

Parameters look like this:

%{"data" => [%{"name" => "Frank", "age" => 23}, %{"name" => "John", "age" => 24}]}

For now I only have created the Repo functions like:

def create_users(attrs) do
    User
    |> Repo.insert_all(attrs)
  end

I’ve searched the entire web and I can’t find any article that explains how the controllers and views should be.

I know this is incorrect because it doesn’t work but it’s more or less what I have right now :frowning:

def create_many(conn, %{"data" => users_params}) do
    case Users.create_users(users_params) do
      {:ok, %{errors: _, rows_affected: _}} ->
        conn
        |> json(%{result: "ok"})
        # render(conn, "bulk_creation_result.json", %{some: result})

      # {:error, _, changeset, _} ->
      #   render(conn, MyApp.ChangesetView, "error.json", changeset: changeset)
    end

As far as the views I really have no clue :frowning:

Does someone have done this yet in the past and could show me a correct example?

Thanks in advance

Marked As Solved

jhefreyzz

jhefreyzz

Does Entries have relationship with User model? If so, you can pass cast_assoc to your changeset pipeline to do bulk insertion.

What do you intent to do with views? Do you want to display the returned data?
When generating a json api using mix phx.gen.json it generates similar to this:

  def render("index.json", %{contacts: contacts}) do
    %{data: render_many(contacts, ContactView, "contact.json")}
  end

  def render("show.json", %{contact: contact}) do
    %{data: render_one(contact, ContactView, "contact.json")}
  end

 def render("phone_number.json", %{number: number}) do
    %{id:  number.id, phone_number: number.phone_number}
 end

 def render("contact.json", %{contact: contact}) do
    %{id: contact.id,
       name: contact.name,
       phone_numbers: render_many(contact.numbers, ContactView, "phone_number.json")
    }
end

Make sure you know the shape of the returned data so you can structure the views.

Given the results:

[
 %Contact{
   id: 'something',
   name: 'some name',
   numbers: [
      %Number{id: 'some id', phone_number: 'some phone number'},
      %Number{id: 'some id', phone_number: 'some phone number'}
   ]
 },
%Contact{
   id: 'something',
   name: 'some name',
   numbers: [
      %Number{id: 'some id', phone_number: 'some phone number'},
      %Number{id: 'some id', phone_number: 'some phone number'}
   ]
 }
]

We can return its json format response like this:

with {:ok, entries} = Users.create_users(users_params) do
        conn
        |> render("contact.json", contact: entries)
end

Be sure to put an action_fallback to your controller so it can automatically handle changeset errors.

In the example I gave, it uses ContactView, in your case change the view name to your appropriate one.

Last Post!

hudsonbay

hudsonbay

Thanks

Where Next?

Popular in Questions Top

minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
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
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
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
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

Other popular topics Top

hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49266 226
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
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
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

We're in Beta

About us Mission Statement