【Rails】seed_fuについて
はじめに
Railsでは、rails db:seed
というコマンドがあり、db/seed.rb
にシードデータを入れておけば、勝手にシードデータを作成してくれます。しかし、これは1度だけシードデータを作成する場合はよいのですが、シードデータを編集して再度実行すると、同じデータを何個も作成されてしまうという問題点があります。そこで、今回は便利にシードデータを生成してくれるseed-fu
というgemを使って、development
,test
,production
それぞれの環境ごとにシードデータを作成する方法を紹介します。
gemの導入とファイルの作成
- gemの導入
gem 'seed-fu'
$ bundle install
- dbディレクトリ配下に
fixtures
を作成
これで、準備完了です。
環境ごとにシードファイルを分ける
この場合は、fixturesディレクトリの中に、それぞれの環境名ディレクトリを作成し、そこにシードファイルを設置することで実現できます。
シードデータを入れる
あとは、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からデータを作成してくれて、先ほどの処理が成功します。