railsで初期データを投入する手順としては、db/seeds.rbを使った手順が一般的です。
標準的な方法で、とりあえずランダムなデータを放り込んだりする用途には便利なのですが、データ量が増えてきたり、リレーションのあるデータを作成したりしないといけなくなると、だんだん辛くなってきます。
本番環境ではユーザーが注文したらorderからuserにリレーションがはられるのに、seeds.rbやfactoryGirlではどうしてエンジニアがいちいちリレーションを考えなきゃいけないのでしょう。いっそ本番環境のデータまるごと持ってきたら楽じゃね?
yaml_dbというgemをつかうと、既存のデータベースにあるデータをyaml形式でダンプしたり、逆にyaml形式のデータをロードすることが出来ます。
データを出力
いつもどおり、Gemfileに書いてbundle installします
gem 'yaml_db'
今あるデータベースのデータを出力させます
rake db:data:dump_dir dir=seed_yml
yaml_dbにより、db/seed_yml ディレクトリの下に現在のDBデータがyml形式でダンプされます。
データをロードする
新しく環境を作る時は、git clone, bundle install, rake db:setup のあと
rake db:data:load_dir dir=seed_yml
を実行することで、初期データが読み込まれます。本番環境からDBをコピーしてきたような状態です。
データを編集する
この状態では、すべてのテーブルのすべてのデータが出力されていますが、実際のユーザーさんの個人情報をむやみに開発環境に持ち出す訳にはいかないですし、delayed_jobのようなデータは初期データとしてロードされないほうがいいでしょう。
ということで、出力したデータをエディタで開いて、開発用データに作り変えます
出力したデータは db/seed_yml/ 以下にテーブルごとのymlファイルとして保存されています。これを編集することで、データをいじることが出来ます。
不要なテーブルはバッサリ削除。一部不要なデータを含むようなファイルはエディタで編集するなどして、開発で使うyamlファイルを作成します。
- 例)ユーザー情報テーブルのデータは、最初の数人(社内ユーザー)をのぞいて削除
- 例)コメントテーブルのデータは、なくても困らないからファイルごと削除
- 例)タグテーブルのデータは、まるごと残して初期データとして取り込む
出来上がったyamlファイルを、migrationファイルなどと同様にGitにCommitしてしまいます。こうすることで、新しく来た開発者さんでも、必要なデータが導入された状態で開発を始めることができます。既存の開発者さんも、キリの良い所でロードし直すことで本番に近い環境を維持することができるので、リリース後に問題が発覚するリスクが抑えられていい感じですね
※ users.ymlをgitに上げると、暗号化済みとはいえパスワードをgitに公開することになるので、ここはちょっと考えどころです...
まとめ
本番DBの環境を元に開発DBのデータを作る流れで説明しましたが、逆のパターンも考えられます。
タグとかカテゴリ名のように、初期データが必要なテーブルに対して、デプロイ時にデータを流しこむような用途でも使えますよね。