PJextra

PJextra

I want to delete some values from a Struct that results of an Ecto Repo.all().
I found this question (https://stackoverflow.com/questions/29351563/whats-a-good-solution-to-drop-nil-value-in-a-struct-for-elixir) which solves it but makes me change from a Struct to a Map.
This question is from 2015.
As of today is there a better/simpler way of deleting a few values while keeping the rest of the Struct?

Showing Posts 1 to 4

voger

voger

I don’t know if there is an answer to your question and I hope someone might offer one. In the meanwhile, I suggest not putting those values there in the first place.

iex(9)> alias MySite.{User, Repo}
[MySite.User, MySite.Repo]
iex(10)> import Ecto.Query
Ecto.Query
iex(11)> query = from u in User, select: [u.username, u.email]
query = from u in User, select: [u.username, u.email]
#Ecto.Query<from u in MySite.User, select: {u.username, u.email}>
iex(12)> Repo.all(query)
Repo.all(query)
[debug] QUERY OK source="users" db=6.8ms decode=0.1ms queue=0.2ms
SELECT u0."username", u0."email" FROM "users" AS u0 []

Also you can define a map in that select and have Repo.all return a list of maps

query = from u in User, select: %{username: u.username, email: u.email}
PJextra

PJextra OP

Yes, you’re right.
But I was trying to understand if there was an easy way of taking those values out after the query because having a Repo.all() in the controller allows me to extract several different variables that I can make available from the controller with just one query.
Otherwise I would need to define several different queries, I think.

voger

voger

I haven’t played with ecto much yet so what I say take it with a grain of salt.

My guess is that you try to get various columns from all the rows in your table based on some conditional logic. i.e.

if (user_requests == username)
   bring username
if (user_requests == email)
  bring email also

bring_all_that_requested()

In this case you can take advantage the fact that ecto queries are composable. So you can mix and mach your queries as you wish. Take a look at this Ecto.Query — Ecto v3.14.0

Update: I tried this myself in iex and indeed can’t compose select

iex(18)> query = from u in User, select: %{username: u.username}
query = from u in User, select: %{username: u.username}
#Ecto.Query<from u in Qssite.User, select: %{username: u.username}>
iex(19)> Repo.all(query)
Repo.all(query)
...
iex(20)> query = from u in query, select: %{email: u.email}
query = from u in query, select: %{email: u.email}
** (Ecto.Query.CompileError) only one select expression is allowed in query

but one can use struct or map for that.

P.S.: If you really want to delete that key then I think Map.delete/2 and Map.drop/2 should suffice. No need to convert to map. Or you could simply set the keys to nil.

  user = Repo.get(User, 1)
  user = user = %{user| email: nil, username: nil}
PJextra

PJextra OP

Setting them to nil is the simplest way, solves my problem and is elegant and immediate to understand what we’re changing.
Thank you a lot!

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews