seed_fuを使って初期データを作成
seed_fuとは
すでに存在しているデータの中の変更したいレコードだけを更新することができたり、ファイル単位でデータを作成することができます。
データを作成するrailsの仕組みとしてseeds.rbファイルに記入する方法がありますが、この方法だとデータの変更があった時に、データを一度削除してから再度追加する必要があリます。seeds.rbファイルに関しては以前まとめた記事を参照してください。
一方で seed-fuを使うと、seed データの変更をしてもrails db:seed_fu
を再度行うだけで変更点だけをデータに反映させることができるという点において優れています。
seeds.rbとseed_fuの違い
seeds.rb
データの一部を変更した時、既存のデータを削除してから再度読み込まなくてはいけない。
seed_fu
変更した部分だけを読み込むことができます。
seed_fuの使用方法
まずGemfileにseed_fuのgemを追加してbundle install
します。
gem 'seed-fu'
seedファイルを置くためのディレクトリを作成します。
$ mkdir db/fixtures $ mkdir db/fixtures/development $ mkdir db/fixtures/production $ mkdir db/fixtures/test
seedファイルはdb/fixtures
配下に作成するのが慣例です。また今回のようにデータを投入する環境(開発、本番、テスト)をディレクトリごとに分けて指定することもできます。
開発環境のUserテーブルにデータを作成していきたいと思います。
まずdevelopment配下にusers.rbファイルを追加します。
$ touch db/fixtures/development/users.rb
ファイルの中身はこのように書きます。
db/fixtures/development/users.rb User.seed do |s| s.id = 1 s.name = 'admin' s.password = "password" s.role = 'admin' end User.seed do |s| s.id = 2 s.name = 'editor' s.password = "password" s.role = 'editor' end User.seed do |s| s.id = 3 s.name = 'writer' s.password = "password" s.role = 'writer' end
上記のコードをシンタックスシュガー(構文の省略した書き方)で記入することもできます。
db/fixtures/development/users.rb User.seed( :id, { id: 1, name: 'admin', password: 'password', role: :admin }, { id: 2, name: 'editor', password: 'password', role: :editor }, { id: 3, name: 'writer', password: 'password', role: :writer }, )
データベースにデータを入れるために下記のコマンドを実行します。
※ データを挿入する環境を指定することもできます。
$ rails db:seed_fu $ rails db:seed_fu RAILS_ENV=development #開発 $ rails db:seed_fu RAILS_ENV=production #本番 $ rails db:seed_fu RAILS_ENV=test #テスト
RSpecでseed_fuのデータを使用
RSpecのテストを実行する前に、ユーザーのデータが存在することを前提に自動テストを実行したいですよね。
そのためにspec/spec_helper.rbファイルに次の記述をしておきます。
参考 : Railsアプリのマスターデータ管理 Seed Fu ベタープラクティス - ナガモト の blog
spec/spec_helper.rb RSpec.configure do |config| config.before(:suite) do SeedFu.seed end end