質問: Railsのfixtureとseedについて4点質問です。 (1) DBにデータを投入する仕組みとしてfixtureとseedがあると思いますが、これらの違いは何でしょうか。 (2) DBはdevelopmentとtestと本番用の3つあると思うのですが、上述のfixtureとseedでは、3つのうちどれが使われるのでしょうか。 (3) コマンド`rails db:migrate`を打てばDBのテーブルが作成されると思いますが、このコマンドではdevelopment用のDBが作成されているという認識で合っていますか。もし、test用のDBを作りたかったら、`rails db:migrate RAILS_ENV=test`とすればOKでしょうか。 (4) 上述の私の認識が合っているとして、`rails db:migrate RAILS_ENV=test`で作られたtest用のDBにfixtureもしくはseedを適用するにはどうすればよいのでしょうか。 よろしくおねがいします。
回答: こんにちは。 わたしもまだ学習しながらなのですが、わかる範囲で書いてみますね。 fixturesとseedに関しては、こちらの記事にとても良く書かれていましたので、リンクを貼っておきます。 * rails db:fixtures:load を使おう (1) fixtureとseedの違い fixtures: どちらもDBにデータを投入するための仕組みですが、fixturesは主にテストに使う場合のデータ登録用に使います。(異なる現場もあるかもしれませんが) Railsに標準でついてくるminitestと組み合わせて利用します。 (こちらも全ての現場が使うわけではなくて、わたしの場合はtest目的では、fixturesよりもFactoryGirlを使っています) seed: こちらは、マスタデータを初期登録したりするのに使います。 たとえば、部署一覧(部署マスタ)、郵便番号一覧、勘定科目一覧、カテゴリ一覧とか。 (seedも必ずしも使われるわけではないです) (2) いつ使う? fixturesはテスト目的なので、RAILS_ENV=test の時。 seedはアプリケーションの前提となるマスタデータ登録が目的なので、test / development / productionどの場合でも使われる可能性があります。 ただし、seedは一切使わない現場もあるので、必須ではないです。 (DB専門の担当者がいる現場では、csvを別に用意してSQLやDB管理用のツールでロードする場合のほうが多いかも?) (3)db:migrate 環境変数 RAILS_ENV をもとにdatabase.yml に記載したどのDBをターゲットにするかが決まります。 指定がなければdevelopmentが対象です。 (4) fixtures または seed の適用方法 Railsでテーブル作成・変更やテスト実行のような作業は、rakeタスクとして用意されています。 $ bundle exec rails -T (または rails -T / rake -TでもOK) とコマンドを打つと、標準で利用できるタスクの一覧が表示されます。 rails db:migrate は対象のDBへテーブルを追加変更削除するコマンドです。 rails -T の結果に、以下2つがあったと思います。 それぞれこうなります。 * rails db:fixtures:load (こちらがfixturesのデータのロード) * rails db:seed (こちらがseedのデータのロード) test用のDBに適用するのであれば、 $ export RAILS_ENV=test # まず先に環境変数を切り替え、対象をtestに向ける $ rails db:migrate # RAILS_ENV=testなのでテストDBにmigration $ rails db:fixtures:load # ひきつづきテストDBにfixturesのデータをロード $ rails db:seed # seedのデータも必要ならseedも実行 こんな感じです。