fireproofsocks

fireproofsocks

Is the only way to support enum columns in an Ecto schema by using a 3rd party package like GitHub - gjaldon/ecto_enum: Ecto extension to support enums in models · GitHub ?

Thanks!

Showing Posts 1 to 7

halostatue

halostatue

No. You just specify the enum column as string in the schema.

I can’t tell you exactly what the migration will look like; we have two projects where we use enums pretty heavily. The first project uses Ecto, Ecto migrations, and Ecto.Enum. The second uses Ecto, Sqitch (which uses straight-up SQL), and does not use Ecto.Enum.

Based on our experiences, I would recommend not using Ecto.Enum if you’re using PostgreSQL. There’s nothing explicitly wrong with the library itself (the documentation is a different matter), but it provides exactly two conveniences:

  1. The ability to specify enums in queries using atoms instead of binaries (:active instead of "active").

  2. The ability to create new enums without knowing the PostgreSQL ‘magic’ (which isn’t really that magic). This really isn’t that hard:

    def up do
      execute ~s"""
      IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'user_status') THEN
        CREATE TYPE user_status AS ENUM ('active', 'inactive');
      END IF;
      """
    end
    

    Note that you have to drop to SQL anyway to add a new value to an enum, and the Ecto.Enum documentation is flat out wrong about the syntax to use (it will cause your migrations to fail if you have to roll back at all, because there’s no possible down phase to ALTER TYPE type ADD VALUE 'value'). Instead of what the Ecto.Enum documentation recommends, use ALTER TYPE type ADD VALUE IF NOT EXISTS 'value' (I submitted this change as a PR, but the maintainer rejected this for some reason).

dwahyudi

dwahyudi

I used enum in rails before, once upon a time, a co-worker just inserted a value in the middle of the enum array and it destroyed the data. :+1:

idi527

idi527

Were you using postgres?

idiot@/tmp:enum_test> create type hello_type as enum ('a', 'b', 'c');
CREATE TYPE
Time: 0.021s
idiot@/tmp:enum_test> create table test (name varchar, type hello_type);
CREATE TABLE
Time: 0.018s
idiot@/tmp:enum_test> insert into test values ('hello', 'a');
INSERT 0 1
Time: 0.007s
idiot@/tmp:enum_test> insert into test values ('hello', 'b');
INSERT 0 1
Time: 0.001s
idiot@/tmp:enum_test> insert into test values ('hello', 'c');
INSERT 0 1
Time: 0.001s
idiot@/tmp:enum_test> select * from test;
+--------+--------+
| name   | type   |
|--------+--------|
| hello  | a      |
| hello  | b      |
| hello  | c      |
+--------+--------+
SELECT 3
Time: 0.008s
idiot@/tmp:enum_test> alter type hello_type add value 'd' after 'a';
ALTER TYPE
Time: 0.004s
idiot@/tmp:enum_test> insert into test values ('hello', 'd');
INSERT 0 1
Time: 0.001s
idiot@/tmp:enum_test> select * from test;
+--------+--------+
| name   | type   |
|--------+--------|
| hello  | a      |
| hello  | b      |
| hello  | c      |
| hello  | d      |
+--------+--------+
SELECT 4
Time: 0.008s

Inserting new enum values works fine there. Deleting them is a bit more involved, but not by much, and it definitely wouldn’t destroy your data if done properly. Instead, using enum types would help keeping it consistent.

Qqwy

Qqwy

TypeCheck Core Team

This is the reason you should always specify the numeric values in an enum. (This is true for both Ruby and any other language with numeric enums like any C-like language)

dwahyudi

dwahyudi

yea, should have used hash enum.

fireproofsocks

fireproofsocks OP

Thank you all for the replies. I think you’ve convinced me to just add a separate normalized table where I can map the ids to human-readable names. That will make it easier for any BI reporting anyhow.

— 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
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
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
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
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

Other Trending Topics Top

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
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews