Rails
seed
Fixture
seed-fu

seed-fuのfixtureをフォルダ分けしたくなって

Railsのデータベースに初期データを投入するのにseed-fuを使っていますが、書き込むものが多くなって悩みも出てきました。

seed-fuとは

詳しくは別な人が書いてくれていますが、データベースの初期値投入を、単に機械的に流すだけでなくて、既存のテーブルと照合しつつ進めていくような仕組みとなっています。

投入するものが増えてきて

マスターとしてデータベースにあれば外部キーをかけられるという事情も手伝って、気がつけばseed-fuで投入する先のモデルが数十個になっていました。そして、fixtureをいくつかのファイルに分けて書いていたのですが、定義を探したり1変更したりしようとする際に、目的のものがなかなか見つからない、という事態を招いてしまっていました。

で、1モデルにつき1ファイルに近いぐらいまで2ファイルを分けてみようと考えたのですが、そのままフラットにファイルを置けば、やはりファイル数が多すぎて見通しが良くない状態となりそうです。

読み込み方法を調べてみた

ということで、seed-fuのコードを追ってみたところ、ディレクトリリストはDir#[]でファイルに展開していることが判明しました。ということで、グロブパターンとして/**/を入れれば、「指定のフォルダとそれ以下」を拾えそうです。

config/initializers/seed-fu.rb
SeedFu.fixture_paths = [Rails.root.join('db', 'fixtures', '**')]

なお、デフォルトではdb/fixtures/#{Rails.env}以下を拾う設定が入っていますが、上のような設定をすればもちろん全フォルダが読み取られますので要注意です。

脚注


  1. Rails内部にブラウジング機能を実装してしまうのもありかなと考えています。 

  2. 外部キーがかかっているので順番があるものなど、一部は切り分けが不適当な箇所もありそうです。