【Rails】seed_fuについて

はじめに

 Railsでは、rails db:seedというコマンドがあり、db/seed.rbにシードデータを入れておけば、勝手にシードデータを作成してくれます。しかし、これは1度だけシードデータを作成する場合はよいのですが、シードデータを編集して再度実行すると、同じデータを何個も作成されてしまうという問題点があります。そこで、今回は便利にシードデータを生成してくれるseed-fuというgemを使って、development ,test,productionそれぞれの環境ごとにシードデータを作成する方法を紹介します。

gemの導入とファイルの作成

  • gemの導入
gem  'seed-fu'
$ bundle install

これで、準備完了です。

環境ごとにシードファイルを分ける

 この場合は、fixturesディレクトリの中に、それぞれの環境名ディレクトリを作成し、そこにシードファイルを設置することで実現できます。

Image from Gyazo

シードデータを入れる

 あとは、db/fixtures配下にモデル単位でシードファイルを作成していきます。例えばUserモデルとBoardモデルが合った場合、次のように書きます。

User.seed do |s|
  s.id = 1
  s.name = 'テストユーザー'
  s.email = 'public@example.com'
end
Board.seed do |s|
  s.id = 1
  s.title = 'テストタイトル'
  s.body = 'テスト本文'
  s.user_id = 1
end

上記のファイルを作成したら、rails db:seed_fuでDBにデータが投入されます。 がしかし、これだとエラー発生してしまいます。

Userのデータが入る前に、BoardがUserを参照しようとしてしまっているからです。

シードデータの順番を制御する

 これは簡単でプレフィックスを付けてあげるだけで解決します。

users.rb → 01_users.rb
boards.rb → 02_boards.rb

これだけで、Userからデータを作成してくれて、先ほどの処理が成功します。