学習記録

アウトプット用に作りました

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