LoginSignup
11

More than 5 years have passed since last update.

seedbankを使って柔軟な初期投入データ構成を実現する

Posted at

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を使ったばかりで、本番でまだ使ったことがないですが...。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11