KDOC 692: モデルを列挙するタスクでfactoryやseedの作り忘れを検知できる

この文書のステータス

  • 作成
    • 2026-10-18 貴島
  • レビュー
    • 2026-10-18 貴島

概要

Railsでは、 Rails.application.eager_load! でモデルをすべて読み込めば、 ApplicationRecord.subclasses でApplicationRecordを直接継承するモデルを列挙できる。これを使うと、モデルごとに用意しておくべきものの作り忘れを検査するrakeタスクを書ける。

  • factoryがないモデル: 各モデルのfactoryで create してみて、未登録の KeyError が出たら作り忘れ
  • レコードがないテーブル: seedを流したあとで、 count がゼロのモデルがあればseedの作り忘れ
task lint: :environment do
  msg = []
  invalid = false

  Rails.application.eager_load!
  ApplicationRecord.subclasses.each do |model|
    msg << "#{model.name} => #{model.count}"
    invalid = true if model.count.zero?
  end

  puts msg

  raise 'レコードがないテーブルがあります' if invalid
end

eager_load! が要るのは、rakeタスクではモデルが使われるまで読み込まれず、読み込まれていないクラスは subclasses に出てこないからである。

eager loadingはconfig.eager_loadフラグで制御します。これはproduction以外のすべての環境でデフォルトで無効になっています。rakeタスクが実行されると、config.eager_loadはconfig.rake_eager_loadで上書きされ、デフォルトではfalseになります。

定数の自動読み込みと再読み込み - Railsガイド

関連

なし。