SQLite仮想テーブルが`ignore_tables`に従うよう修正

rails/rails

SQLiteの仮想テーブルが ActiveRecord::SchemaDumper.ignore_tables の設定を無視してスキーマダンプに出力されていたバグが修正されました。1行の修正により、通常テーブルと同様に仮想テーブルもフィルタリングされるようになります。

背景

#56976 で報告されたこのバグは、SQLiteの仮想テーブルがスキーマダンプ時に ignore_tables の指定を無視するというものでした。ActiveRecord::SchemaDumper.ignore_tables に仮想テーブル名を追加しても、schema.rb には create_virtual_table "fts_docs", "fts5", ["content"] のように出力され続けていました。

この問題は、FTS5(全文検索)や Spatialite(#56969 参照)のような拡張機能が自動生成する仮想テーブルを schema.rb から除外したいケースで特に問題となっていました。これらの仮想テーブルは通常アプリケーションコード側で管理されるため、スキーマダンプへの混入を避けることが求められます。

技術的な変更

sqlite3/schema_dumper.rbvirtual_tables メソッドに、ignored? チェックが追加されました。変更箇所はわずか1行です。

変更前:

def virtual_tables(stream)
  virtual_tables = @connection.virtual_tables
  if virtual_tables.any?
    # ...
  end
end

変更後:

def virtual_tables(stream)
  virtual_tables = @connection.virtual_tables.reject { |name, _| ignored?(name) }
  if virtual_tables.any?
    # ...
  end
end

@connection.virtual_tables が返すのは [name, type, columns] の形式のデータです。reject ブロックでは name のみを取り出し、親クラス ConnectionAdapters::SchemaDumper が持つ既存の ignored? メソッドに渡してフィルタリングしています。通常テーブルのダンプでも同じ ignored? メソッドが使われており、一貫した動作になります。

テストは virtual_table_test.rb に追加され、ignore_tables"searchables" を指定した状態でスキーマダンプを実行し、create_virtual_table "searchables" が出力に含まれないことを検証します。

def test_schema_dump_ignores_virtual_tables_in_ignore_tables
  output = dump_all_table_schema(["searchables"])

  assert_not_includes output, 'create_virtual_table "searchables"'
end

設計判断

通常テーブルとの対称性を保つ最小限の修正 が採用されました。

ignored? メソッドは親クラスである ConnectionAdapters::SchemaDumper に既に定義されており、通常テーブルのフィルタリングで使われている共通ロジックです。仮想テーブルの処理だけがこのメソッドを呼んでいなかったという実装漏れを、reject の追加だけで修正しています。新たなメソッドや設定項目を導入せず、既存のインターフェースを活用することで、APIの複雑さを増やさずに一貫性を回復した判断といえます。

まとめ

virtual_tables メソッドへの1行追加により、SQLite仮想テーブルが ignore_tables の設定に従うようになりました。FTS5テーブルや Spatialite が生成する仮想テーブルを schema.rb から除外したいユースケースで、追加の回避策なしに期待通りの動作が得られます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
2c1d1101

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「リード文(総論)→背景・技術詳細(各論)→まとめ(結論)」という理想的な3部構成が明確に守られています。各セクションの役割が明確で、記事の流れが非常にスムーズです。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```ruby:path)とGitHubのIssue/PRへのリンク記法([#123](URL))が、ガイドラインに沿って正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

専門用語(仮想テーブル, FTS5, SchemaDumperなど)が適切に使用されており、Railsの内部実装にある程度詳しいエンジニアという対象読者に合致した内容です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各段落がトピックセンテンスで始まり、1段落1トピックの原則が守られています。見出しと各段落の最初の文を読むだけで記事の骨子を理解できる、模範的なパラグラフ・ライティングです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコードは、提供されたDiffの内容と正確に一致しています。変更点とテストコードの引用が的確で、変更内容の理解を助けています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`virtual_tables`, `ignore_tables`, `SchemaDumper`などの技術用語が、PRのコンテキストと一般的なRailsの用語法に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

コード変更(`reject`の追加)がなぜバグ修正に繋がるのか、その技術的な理由(`ignored?`メソッドの再利用)が論理的かつ正確に説明されています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張は、PRのタイトル、Diff、関連Issue番号(#56976)から裏付けが取れます。根拠のない推測や憶測(ハルシネーション)は見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#56977)やIssue番号(#56976, #56969)などの固有名詞・数値が、元の情報と完全に一致しており正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「SQLite仮想テーブルが`ignore_tables`に従うよう修正」は、PRのタイトル「Fix SQLite virtual tables not ignored by `ignore_tables`」の内容を的確に要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事はPRとその直接のコンテキスト(関連Issueなど)に基づいており、バージョンサポート情報やリリース予定など、PR情報外の検証不可能な外部知識を含んでいません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「〜されていたバグが修正されました」といった過去形・完了形の表現が使われており、PRが完了した変更であることを正確に反映しています。時間表現の歪曲はありません。