Railsでseed-fuを使って初期データ作成する方法

✏️ 2019/08/12 👍2019/08/19

概要

デフォルトでbin/rails db:seedで初期データを作成することができますが、作成する度に同じデータが作成されてしまいます。
bin/rails db:seed_fuを利用すると、初期データの追加や管理が用意になります。

ダウンロードとインストール

ダミーデータを作成するために、faker-ruby/fakerも一緒にインストールします。

# Gemfile
group :development do
  gem 'seed-fu'
  gem 'faker'
end
bundle

ディレクトリを作成

mkdir db/fixtures

Seed fileを作成

touch db/fixtures/01_post.rb

※ seed ファイルはアルファベット順に読み込まれます。ファイル名に01など付けると読み込み順序を制御しやすくなります。

faker-ruby/fakerを利用して初期データを作成します。

# db/fixtures/01_post.rb
require 'faker'

(1..10).each do |i|
  Post.seed do |s|
    s.id =  i
    s.title = Faker::Lorem.sentence
    s.content = Faker::Markdown.sandwich
  end
end

Seedデータを追加

bin/rails db:seed_fu

データを更新したい場合はdb/fixtures/01_post.rb を修正して、再度 bin/rails db:seed_fu を実行します。

関連付け(アソシエーション)

1対多の場合

# db/fixtures/01_post.rb
(1..10).each do |i|
  Post.seed do |s|
    s.id =  i
    s.title = Faker::Lorem.sentence
    s.content = Faker::Markdown.sandwich

    s.category = Category.find_by!(name: 'Development')

  end
end

多対多の場合

タグをrandomに2つ取得して、Seed データに追加します。

# db/fixtures/01_post.rb
(1..10).each do |i|
  Post.seed do |s|
    s.id = i
    s.slug = "slug-#{i}"
    s.title = Faker::Lorem.sentence
    s.content = Faker::Markdown.sandwich
  end
  Post.find(i).tags << Tag.where(name: Tag.pluck(:name)).sample(2)
end

以上で、Seed_fuを使ったSeed データの作成方法は完了です。

参考

akito
日本のスタートアップで主にRuby on Railsを使ってプロダクト開発をしています。