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 ![]()
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 ![]()
Does someone have done this yet in the past and could show me a correct example?
Thanks in advance
Marked As Solved
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.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








