Best way to delete values in a Struct

I want to delete some values from a Struct that results of an Ecto Repo.all().
I found this question ( 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?

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
iex(11)> query = from u in User, select: [u.username,]
query = from u in User, select: [u.username,]
#Ecto.Query<from u in MySite.User, select: {u.username,}>
iex(12)> 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:}

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.

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


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

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)
iex(20)> query = from u in query, select: %{email:}
query = from u in query, select: %{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}

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!