Ruby on Rails での PostgreSQL コメントによる列挙型識別の合理化
概要
私は Ruby on Rails を使用していますが、現在、PostgreSQL 列内の列挙型を表す数値の意味を識別しようとしているときに課題に直面しています。たとえば、{0: 削除済み、1: ライブ、2: 一時停止、3: エンキュー済み、…} のような値を含むステージ列があり、データベース IDE 内でこれらの関連付けを簡単に識別する方法を探しています。データグリップ。
この目的のために PostgreSQL コメントを自動的に生成する方法はありますか?
解決策
移行を使用してコメントを追加できます。例えば
class AddCommentsToStatusColumn < ActiveRecord::Migration[7.0]
def up
comment_text = <<-SQL
COMMENT ON COLUMN jobs.status IS
'Enum: 0 => removed, 1 => live, 2 => suspended, 3 => enqueued';
SQL
execute(comment_text)
end
def down
execute("COMMENT ON COLUMN jobs.status IS NULL;")
end
end
または、複数の列挙型に対してこれを自動化したい場合は、rake タスクを使用できます。複数のモデルで動作するようにこれを変更できます。こうすることで、列挙型を更新するたびに、この rake タスクを再実行して、それに応じてコメントを更新できます。
namespace :db do
desc "Add enum comments"
task enum_comments: :environment do
comment_text = Job.defined_enums.map do |name, values|
value_mappings = values.map { |k, v| "#{v} => #{k}" }.join(", ")
<<-SQL
COMMENT ON COLUMN jobs.#{name} IS 'Enum: #{value_mappings}';
SQL
end.join("\n")
ActiveRecord::Base.connection.execute(comment_text)
end
end
rake タスクには 2 つの欠点があります。
そして、移行には独自の欠点もあります。
私の最初の間違った答え:
たとえば、ステータスなどの整数列がテーブルにある場合。次に、次のように列挙型を書くことができます
オプション1:
enum status: { removed: 0, live: 1, suspended: 2, enqueued: 3 }
オプション 2:
enum status: [:removed, :live, :suspended, :enqueued]