Techioz Blog

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]