WeBlog

Webに関する情報を中心に発信してるブログ

gem seed-fu を使って、ダミーデータを作成する

gem seed-fu を使うことでダミーデータを入れることができます。

railsにはデフォルトで rails db:seed というコマンドを使って、db/seeds.rbを実行することでダミーデータを入れることができます。

db/seeds.rbは何も考えずに使うと、rails db:seed というコマンドを実行するたびに同じデータが登録されてしまいます。

gem seed-fuは、すでにデータベース(カラム)に存在しているが、変更したいレコードだけ更新したり、ファイル単位で実行できたり、簡単に書けるような便利さがあります。

https://github.com/mbleigh/seed-fu

使い方

インストール

# Gemfile
gem 'seed-fu'

Gemfileに記述して、bundle install します。

ディレクトリを作成

seedファイルを置くディレクトリを作成します。

f:id:weblog_tec:20210610094453p:plain

% mkdir db/fixtures
% mkdir db/fixtures/development
% mkdir db/fixtures/production
% mkdir db/fixtures/test

db/fixturesは絶対に必要なディレクトリです。

このディレクトに下にseedファイルを置きます。

db/fixtures配下に環境ごとにシーダーファイルを作りたい場合は、「development」「production」とディレクトリを作成します。

データを作成してみる

# db/fixtures/delopment/users.rb
User.seed do |s|
  s.id    = 1
  s.name = "田中"
  s.crypted_password = "password"
end

User.seed do |s|
  s.id    = 2
  s.name = "佐藤"
  s.crypted_password = "password"
end

Userモデルが存在していたとして、gem seed-fuではデータを上記のように書けます。

データを作成するコードは上記のようにdo ~ end で記載できます。

User.seed(
  :id,
  { id: 1, name: '田中', crypted_password: User.encrypt('password') },
  { id: 2, name: '佐藤', crypted_password: User.encrypt('password') },
)

しかし、多くのレコードを記載する場合、do ~ endブロックの構文は長くなる可能性があります。

代わりに上記のように書けます。

そして、rails db:seed_fuコマンドを使って、seedファイルからデータを投入できます。

https://qiita.com/ko2ic/items/be96e450a33d631e0059

https://qiita.com/punkshiraishi/items/18c80475fcd50d708dc4

https://bagelee.com/programming/make-data-with-seed-fu/

テストでseedデータを挿入する

Rspecを使ってテストを実行する前にデータベースにデータを入れておきたいことがあります。

seed-fuを使用して、事前にデータベースにデータを入れておく方法を書きます。

# db/fixtures/test/sites.rb

Site.seed(
    :id,
    id: 1,
    name: 'タイトル',
    subtitle: 'サブタイトル'
)

例えば上記のようにあるサイトの「タイトル」と「サブタイトル」をテスト前にデータベースに保存しておきたいと思います。

このファイルはdb/fixtures/test配下に用意しておきます。

# spec/spec_helper.rb

RSpec.configure do |config|
    # テスト開始前にDBにデータを入れる。db/fixtures/test/sites.rb ファイルの seed-fu を使う
  config.before :suite do
    SeedFu.seed
  end

spec/spec_helper.rbに上記のように記載しておくと、テスト実行前にデータを挿入できます。

デフォルトでは、シード ファイルは

で検索されます。

なので、テストの時は/db/fixtures/test配下のseedファイルを実行してくれます。

https://qiita.com/naoki_mochizuki/items/1d3026a32786642fc762