[Rails] PostgreSQLスキーマダンパーにおけるクロススキーマ外部キー参照の修正

rails/rails

問題の概要

RailsのPostgreSQLスキーマダンパーには、異なるスキーマ間の外部キー制約をダンプする際に、誤ってスキーマ名を重複して付与してしまうバグがありました。具体的には、参照先テーブルが既にスキーマ修飾されている場合(schema.table形式)でも、さらに別のスキーマ名を先頭に付与してしまう問題です。

例えば、hst.event_log_attributesからusr.user_profilesへの外部キーが、ダンプ時にhst.usr.user_profilesとして出力されてしまい、実際には存在しないテーブル名になっていました。

技術的な変更内容

修正箇所

relation_nameメソッドに、既にスキーマ修飾された名前かどうかをチェックするロジックが追加されました。

変更前:

def relation_name(name)
  if @dump_schemas.size == 1
    name
  else
    "#{schema_name}.#{name}"
  end
end

変更後:

def relation_name(name)
  if @dump_schemas.size == 1
    name
  elsif name.include?(".")
    name  # Already schema-qualified, don't add another prefix
  else
    "#{schema_name}.#{name}"
  end
end

動作の違い

修正により、スキーマダンプの出力が以下のように変わります。

修正前:

add_foreign_key "hst.event_log_attributes", "hst.event_logs"
add_foreign_key "hst.event_log_attributes", "hst.usr.user_profiles", column: "created_by_id"

修正後:

add_foreign_key "hst.event_log_attributes", "hst.event_logs"
add_foreign_key "hst.event_log_attributes", "usr.user_profiles", column: "created_by_id"

テストケースの追加

異なるスキーマ間の外部キー制約を正しくダンプできることを確認するテストが追加されました。

def test_schema_dump_with_cross_schema_foreign_key
  with_dump_schemas(:all) do
    output = dump_all_table_schema

    assert_includes output, 'add_foreign_key "test_schema.cross_schema_fk_table", "test_schema2.referenced_table"'
    assert_not_includes output, 'add_foreign_key "test_schema.cross_schema_fk_table", "test_schema.test_schema2.referenced_table"'
  end
end

このテストでは、test_schema.cross_schema_fk_tableからtest_schema2.referenced_tableへの外部キーが正しくダンプされること、そして誤った形式(スキーマ名の重複)では出力されないことを確認しています。

影響範囲

この修正は以下のような環境で効果を発揮します:

  • PostgreSQLで複数のスキーマを使用している
  • 異なるスキーマ間で外部キー制約を設定している
  • db:schema:dumpdb:structure:dumpを実行してスキーマファイルを生成している

修正により、ダンプされたスキーマファイルを使用してデータベースを再構築する際に、正しいテーブル名で外部キー制約が作成されるようになります。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事構成、カスタムMarkdown構文、対象読者レベルの全ての項目でガイドラインを完全に満たしています。特に、必須要素(Title, Context, Technical Detail)が明確に分離され、コードブロック前後の空行といった細かなルールも遵守されており、可読性が非常に高いです。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ✓ PASS

技術的な正確性と表現の適切性

Diffの内容を正確に反映しており、技術的な説明も論理的かつ正確です。PRのDescriptionにある出力例を『動作の違い』として引用することで、変更の影響が具体的に理解できるよう工夫されています。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ✓ PASS

元のPR情報との一致度

記事内のすべての主張はPRのTitle、Description、Diffのいずれかで裏付けられており、ハルシネーションは検出されませんでした。PR番号も正確で、元の情報を忠実に記事化できています。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除