Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails: PostgreSQLアダプタでenumのリネーム、enum値の追加とリネームが可能になった(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。
#44898はRails 7.1から利用可能になる予定です。なおadd_enum_valueはマイグレーションをロールバックできない点にご注意ください。

参考: 週刊Railsウォッチ20230704: (PostgreSQL向け)マイグレーションでenumのリネーム、値の追加、値のリネームが可能になった

Rails: PostgreSQLアダプタでenumのリネーム、enum値の追加とリネームが可能になった(翻訳)

Rails 7には、enum型を追加・削除するメソッドが既に追加されています(#115262)。

今回ついにRails 7が拡張されて、PostgreSQLデータベースアダプタで利用できる「enumのリネーム」「enum値の追加」「enum値のリネーム」機能が追加されました(#44898)。

🔗 改修前

今回の改修前は、enumのリネーム、enum値の追加、enum値のリネームを行うには生SQL文を使うしかありませんでした。

🔗 enumのリネーム

# enumのリネーム:
def up
  execute <<-SQL
    ALTER TYPE user_status RENAME TO user_state;
  SQL
end

🔗 新しいenum値の追加

# 新しいenum値の追加:
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

🔗 enum値のリネーム

# enum値のリネーム:
def up
  execute <<-SQL
    ALTER TYPE user_state RENAME VALUE "trashed" TO "deleted"
  SQL
end

🔗 改修後

今回の改修によって、enumのリネーム、enum値の追加、enum値のリネームを手軽に行えるようになりました。

🔗 enumのリネーム

# enumのリネーム:
def up
  rename_enum :user_status, to: :user_state
end
-- 発行されるSQL
--
-- Name: user_state; Type: TYPE; Schema: public; Owner: -
--

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

🔗 新しいenum値の追加

# 新しいenum値の追加:
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
-- 発行されるSQL
CREATE TYPE public.user_state AS ENUM (
    'pending',
    'active',
    'archived',
    'trashed'
);

🔗 enum値のリネーム

# 変更前のレコード:
#<User:0x000000010cb1d390
  id: 1,
  email: "test@example.com",
  phone: "234567890",
  state: "trashed"
>
# enum値のリネーム:
def up
  rename_enum_value :user_state, from: "trashed", to: "deleted"
end
-- 発行されるSQL
CREATE TYPE public.user_state AS ENUM (
    'pending',
    'active',
    'archived',
    'deleted'
);
# 変更後のレコード:
#<User:0x000000010cb1d390
  id: 1,
  email: "test@example.com",
  phone: "234567890",
  state: "deleted"
>

参考資料

関連記事

Railsのenumを使いこなす方法(翻訳)

Rails 7: PostgreSQLのカスタムenum型が使いやすくなった(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。