Rails 7 extends enum support for Postgres adapter

Previously rails 7 added the support to add enums and drop the enums.

Now, Rails 7 has extended the ability to rename an enum, add enum value and rename enum value for the Postgres database adapter.

Before:

Before this change the only way to achieve renaming enum, adding enum value or renaming enum values was to use raw SQL statements.

Renaming the enum:

def up
  execute <<-SQL
    ALTER TYPE user_status RENAME TO user_state;
  SQL
end

Adding a new enum value:

def up
  execute <<-SQL
    ALTER TYPE user_state ADD VALUE 'archived';
    ALTER TYPE user_state ADD VALUE 'pending' BEFORE 'active';
    ALTER TYPE user_state ADD VALUE 'trashed' AFTER  'archived';
  SQL
end

Renaming the enum value:

def up
  execute <<-SQL
    ALTER TYPE user_state RENAME VALUE "trashed" TO "deleted"
  SQL
end

After:

After this change now it is easier to rename the enum, add a new value and rename the enum value

Renaming the enum:

def up
  rename_enum :user_status, to: :user_state
end
--
-- Name: user_state; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE public.user_state AS ENUM (
    'active'
);

Adding a new enum value:

def up
  add_enum_value :user_state, 'archived'
  add_enum_value :user_state, 'pending', before: 'active'
  add_enum_value :user_state, 'trashed', after: 'archived'
end
CREATE TYPE public.user_state AS ENUM (
    'pending',
    'active',
    'archived',
    'trashed'
);

Renaming the enum value:

Record before:

#<User:0x000000010cb1d390
  id: 1,
  email: "test@example.com",
  phone: "234567890",
  state: "trashed"
>
def up
  rename_enum_value :user_state, from: "trashed", to: "deleted"
end
CREATE TYPE public.user_state AS ENUM (
    'pending',
    'active',
    'archived',
    'deleted'
);

Record after:

#<User:0x000000010cb1d390
  id: 1,
  email: "test@example.com",
  phone: "234567890",
  state: "deleted"
>

References:

Enum in PostgreSQL - https://www.postgresql.org/docs/current/datatype-enum.html

Need help on your Ruby on Rails or React project?

Join Our Newsletter