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"
>
概要
元サイトの許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。
#44898はRails 7.1から利用可能になる予定です。なお
add_enum_value
はマイグレーションをロールバックできない点にご注意ください。参考: 週刊Railsウォッチ20230704: (PostgreSQL向け)マイグレーションでenumのリネーム、値の追加、値のリネームが可能になった