未分類

[Rails]fakerとseedでダミーデータを作成する

Railsには、初期データ(マスターデータ)をアプリケーションに入れる方法として、db/seedsファイルを読み込ませたり、seed-fuというライブラリを用いて行われます。

seed-fuについては、更新が現在されていないライブラリになりますので、

基本的には、seeds.rbに書いて、それをデータベースにデータを注入するのがいいと思います。

アプリケーションに必要なモデルやテーブルを作成する

まずは、アプリケーションを作成します。

$ rails new boards_app_practice

$ cd boards_app_practice

 

今回は、掲示板機能を持ったアプリを作成しようと思いますので、usersテーブルとboardsテーブルを用意しようと思います。

$ rails g model user name:string email:string 

$ rails g model board title:string content:text user:references

$ rails db:migrate

 

これで、usersテーブルとboardsテーブルを作成することができました。

アソシエーションを記述する

続いて、モデルにアソシエーションを記述します。

先ほど、boardモデルを作成した際に、referencesオプションをつけたので、boardモデルが作成されたタイミングでbelongs_to: userという記述があるので、userモデルにだけアソシエーションを追加で記述します。

class User < ApplicationRecord
 has_many :boards, dependent: :destroy
end

seeds.rbに登録したいデータを記述する

db/seeds.rbに初期データを書いていきます。

# db/seeds.rb

User.create!(name: 'ゆうき', email: 'foo@example.com')

Board.create!(title: '星の王子さま', content: '面白かった', user_id: User.first.id)

 

seedsファイルを実行する。

$ rails db:seed

 

このコマンドを実行することで、seeds.rbのファイルが読み込まれます。

ターミナルのコンソールで挙動を確認してみましょう!

irb(main):001:0> User.all
   (2.3ms)  SELECT sqlite_version(*)
  User Load (0.4ms)  SELECT "users".* FROM "users" /* loading for inspect */ LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<User id: 1, name: "ゆうき", email: "foo@example.com", created_at: "2021-11-08 15:56:42.717825000 +0000", updated_at: "2021-11-08 15:56:42.717825000 +0000">]>
irb(main):002:0> Board.all
  Board Load (1.5ms)  SELECT "boards".* FROM "boards" /* loading for inspect */ LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Board id: 1, title: "星の王子さま", content: "面白かった", user_id: 1, created_at: "2021-11-08 15:56:42.807640000 +0000", updated_at: "2021-11-08 15:56:42.807640000 +0000">]>

 

このようにDBにデータが注入されたのがわかると思います。

モデル名.allとすることで、そのモデルに紐づいているDBのテーブルからデータを引っ張ってくることができます。

もしも、seedファイルのインサートをやり直したい時は以下のコマンドを実行します。

# seedデータのインサートをやり直したいとき
$ rails db:migrate:reset

$ rails db:seed

fakerを使って、リアルなダミーデータを簡単に作成する

今の時点では、テストデータが1件ずつしか入っていないのであまり気になりませんが、何十件もダミーデータを入れたい時があると思います。

その時に使うと楽になるのが、Fakerと呼ばれるライブラリ(gem)です。

[Fakerの公式ドキュメント](https://github.com/faker-ruby/faker)

Fakerをインストールする

# Gemfile

gem 'faker'
$ bundle install

 

Fakerは、このようにキーに対して、値を設定してやることで使うことができます。

User.create!(
  name: Faker::JapaneseMedia::StudioGhibli.character,
  email: Faker::Internet.email
)

Board.create!(
  title: Faker::Books::CultureSeries.book,
  content: Faker::JapaneseMedia::OnePiece.quote,
  user_id: User.first.id
)

 

記述ができたら、seedsファイルを読み込みます。

先ほど読み込んだデータを削除したいので、先にこのコマンドを入力してください!

$ raild db:migrate:reset
$ rails db:seed

 

再度コンソールでデータが作成されたかを確認してみましょう!

irb(main):001:0> User.all
   (1.8ms)  SELECT sqlite_version(*)
  User Load (0.8ms)  SELECT "users".* FROM "users" /* loading for inspect */ LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<User id: 1, name: "Howl Jenkins Pendragon", email: "rebecka.greenfelder@carroll-haley.net", created_at: "2021-11-08 16:14:29.111851000 +0000", updated_at: "2021-11-08 16:14:29.111851000 +0000">]>
irb(main):002:0> Board.all
  Board Load (0.8ms)  SELECT "boards".* FROM "boards" /* loading for inspect */ LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Board id: 1, title: "Surface Detail", content: "Don't ever think there's any perfect society made ...", user_id: 1, created_at: "2021-11-08 16:14:29.151637000 +0000", updated_at: "2021-11-08 16:14:29.151637000 +0000">]>

 

Fakerを使って、ダミーデータを作ることができました!

データを複数個作成する

5.times {
  User.create!(
    name: Faker::JapaneseMedia::StudioGhibli.unique.character,
    email: Faker::Internet.unique.email
  )
}

User.all.each do |user|
  Board.create!(
    title: Faker::Books::CultureSeries.unique.book,
    content: Faker::JapaneseMedia::OnePiece.unique.quote,
    user: user
  )
end

 

timesメソッドと、配列のeach文を用いて、このように書くことで、複数のデータを作成することができます。

uniqueはFakerのオプションのようなもので、一意性をもった値を作成することができます。

また、個々のデータを自分で指定して複数作成したい場合はこのように書くことができます。

User.create!(
  [
    { name: 'サンジ', email: 'sanji@example.com' },
    { name: 'フランキー', email: 'flanky@example.com'},
    { name: 'ロビン', email: 'robin@example.com' }
  ]
)

Board.create!(
  [
    { title: 'ハリーポッター', content: '賢者の石', user: User.first },
    { title: 'ロードオブザリング', content: '王の帰還', user: User.second },
  ]
)

 

公式ドキュメントを見ると、ポケモンやドラゴンボールなど、私たち日本人に馴染みのあるダミーデータも作成することができますので、興味がある方は是非使ってみてください!!

# ドラゴンボール
Faker::JapaneseMedia::DragonBall.character #=> "Goku"
Faker::JapaneseMedia::DragonBall.race #=> "Saiyan"
Faker::JapaneseMedia::DragonBall.planet #=> "Namek"

# ポケモン
Faker::Games::Pokemon.name #=> "Pikachu"
Faker::Games::Pokemon.location #=> "Pallet Town"
Faker::Games::Pokemon.move #=> "Thunder Shock"

 

最後まで読んでいただきありがとうございます。

皆さんの学習に役立てますと幸いです。

それではまた!!

参考記事

Fakerの公式ドキュメント

https://github.com/faker-ruby/faker

seed-fuの公式ドキュメント

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

ABOUT ME
YasuharaKenta
社会人3年目の年になります。2年間専門商社の営業として従事し、現在は都内でWebエンジニアとして働いています。 新人エンジニアとしてわからないことなどを、分かりやすくブログにまとめれるように頑張っていきます!!
株式会社Playgroundのサービス
  • 無料・簡単・片手でホームページを作成できる自社サービス Rakwi
  • Web制作とアプリ開発を学べるオンラインプログラミング講座 Upstairs
  • 開発,DX推進支援サービス スタートアッププラン

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA