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になります。
関連
なし。