db/seeds.rbのつらみ
Railsのdb/seeds.rbは開発初期にはそのまま使っても問題がないのですが、サービスが大きくなったり、運用が始まったりするとなかなかつらみが出てきます。つらい点を上げると以下のようになるでしょうか。
- 準備すべき初期データが増えるため、ファイルが肥大化する。
- モデル間の依存関係を考慮しなくてはならなくなってくる(例:市区町村データの前に都道府県データが入っていないといけない。)
- 環境毎に投入するデータを分けるため、分岐が発生する(例:開発環境ではテストデータを入れておきたいが、本番環境では登録したくない。)
- 運用開始後、一部のseedだけ本番環境に適用したい場合、手動で切り出すしかない。(例:
Prefecture
モデルだけが存在していたところにCity
モデルを追加して市町村データをDBに流し込む場合)。
seedbankでseeds.rbを分割する
seedbankは上記の問題を解決してくれるgemです。
ファイルの肥大化を防ぐ
gemのREADMEにあるように、seedbankは db/seeds
以下に分割された .seeds.rb
で終わるファイルを読み込み、データベースに流し込んでくれます。このため、db/seeds.rb
にある初期データを適切なファイル名で分割していくことができます。db/seeds.rb
は最終的にseedbankを使っていることを書いたコメントだけ残しておくと新しくプロジェクトに参加した人にわかりやすいでしょう。
データ間の依存関係を解決する
seedbankでは after :table_name do ... end
のように記述することで、読み込むデータの順番を制御することができます。上記の市区町村と都道府県の例であれば、先に都道府県のデータを登録しておいた上で、
# in db/seeds/cities.seeds.rb
after :prefectures do
# PrefectureモデルにCityモデルを紐付けて登録
end
のようにできます。
環境毎に利用するseedファイルを切り分ける
seedbankでは、db/seeds/development/
のようにenvironment名毎にフォルダを切ることで、その環境だけで読み込まれるseedファイルを作ることができます。これにより、開発環境だけで使うテストユーザの設定や独自の初期データなどを設定することが出来ます。
本番環境に途中から一部のseedを追加する
seedbankはdb/seeds
以下のseedファイルに対応したrake taskを作ってくれます。たとえば、db/seeds/prefectures.seeds.rb
というファイルがあった場合、rake db:seed:prefectures
を実行することで該当するデータだけ読み込みができます。seedbank gemをproductionやstagingでも有効にすることで、追加の初期データ投入が楽になるでしょう。今日開発環境でseedbankを使ったばかりで、本番でまだ使ったことがないですが...。