mlen

mlen

Ecto.Enum select underlying id

I seem to be stuck on some basic Ecto logic.

my Ecto version is 3.7.1

Given some schema:

schema :users do
  field :name, string
  field :zone, Ecto.Enum, values: ["Zone A": 1, "Zone B": 2, "Zone A and B": 3]  # stored as integer in db
  ..
end

FYI: I don’t want to use composite types of :array, neither :string type for the zone.

Then when I do query the data:

# simplified for brevity
from(
  u in Users,
  select: [:id, :name, :zone],
  where: [name: ^some_name]
)
|> Repo.all()

Each user object’s zone is shown as atom:

%MyApp.Users.User{
  __meta__: ...,
  id: 1,
  name: "User A",
  zone: :"Zone A"  # I need this as integer
}

How do I make Ecto return the corresponding ids for zone field?

The reason I need that is later in the code I’m trying to create two list of users (with one db query), like so:

users  = Users.get_all_active_users()
users_zone_a = Enum.reject(users, fn u -> u.zone == 2 end)
users_zone_b = Enum.reject(users, fn u -> u.zone == 1 end)

Any help greatly appreciated :slight_smile:

Marked As Solved

LostKobrakai

LostKobrakai

The whole idea of Ecto.Enum is to not spread the persisted value (the integers in your case) all over the codebase. You’re expected to use the atoms wherever you interact with the field, not the integers. Otherwise you could just use an :integer field to begin with.

But also there’s Ecto.Enum.mappings if you want to map between the representations.

Also Liked

krasenyp

krasenyp

That’s the idea of the enum in this case, to separate the presented value from the persisted one. What I would advise is to create a helper module which can encode and decode integers to and from :"Zone A", :"Zone B" and so on. You should do the encoding/decoding at the “points” where your code interacts with the external word e.g. HTTP endpoints, database. This would allow you to work only with meaningful values and your comparisons will work.

Where Next?

Popular in Questions Top

New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
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
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New

Other popular topics Top

marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 53690 245
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
nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36128 110
New

We're in Beta

About us Mission Statement