[Rails] Fakerを使ってダミーデータを作成する

学習記録

はじめに

Fakerというgemを使ってダミーデータを作成していくやり方をみていきましょう。

Fakerについて

Fakerとは、偽のデータを生成するgemです。開発するにおいて、なにかテストデータが欲しくなることがあるでしょう。しかし、一つ一つ自分で作成するのはとても骨が折れますし、非常に面倒です。

このgemを使えば、本物そっくりのテストデータを作ったり、開発中のデータベースに1つや2つ以上のレコードを入力させたりするのに非常に便利です。

注意点として、Fakerはランダムにデータを生成しますが、返される値はデフォルトではユニークであることが保証されていません。一意の値が必要な場合は、明示的にuniqueと指定する必要があります。

seeds.rbについて

データベースに初期データを投入するファイルです。こちらに登録したいデータを記述していきます。

作業の流れ

  • Fakerのインストール
  • seeds.rbにテストデータを生成するコードを追記

Fakerのインストール

GemfileにFakerを追記します。

gem 'faker'
$ bundle install

seeds.rbにテストデータを生成するコードを追記

seeds.rbに、テストデータとしてuserを10件とboardを20件生成するコードを追加します。

10.times do                            # userのダミーデータ
  User.create!(
    last_name: Faker::Name.unique.last_name,
    first_name: Faker::Name.unique.first_name,
    email: Faker::Internet.unique.email,
    password: "12345678",
    password_confirmation: "12345678"
  )
end

20.times do |index|                    # boardのダミーデータ
  Board.create!(
    user: User.offset(rand(User.count)).first,
    title: "タイトル#{index}",
    body: "本文#{index}"
  )
end

コードを紐解く

create!を使うワケ

createtruefalseを返すメソッドなので、userの作成に失敗した場合もエラーを出してくれません。なので、user作成失敗時に例外を発生させるcreate!を選択しているのですね。

Faker::Name.unique.last_name

FakerのなかのNameにあるlast_nameメソッドを使うことを指定しています。さらにuniqueを付与することで、一意な値を生成させます。

User.offset(rand(User.count)).first

offsetメソッドは、特定のレコード位置から取得します。

# 例) usersテーブルの6件目から取得 
User.offset(5)

randメソッドは疑似乱数を生成するメソッドです。整数値を与えると、0からその整数値未満の整数を返します。

irb(main):007:0> rand         # 疑似乱数浮動小数点数を返
=> 0.7382187020310742
irb(main):008:0> rand(5)       # 0から5未満の整数を返す
=> 1
irb(main):009:0> rand(5)
=> 4
irb(main):010:0> rand(5)
=> 3

User.count は、Userモデル個数を返します。

irb(main):045:0> User.count
   (0.1ms)  SELECT COUNT(*) FROM "users"
=> 33

User.offset(rand(User.count)).first は、

Userモデルの個数から (33だとすると0から32までの数字) ランダムに数字を生成し、usersテーブルのデータ取得開始位置を決めて、その最初のユーザーデータを返すように指示しています。

irb(main):020:0> User.offset(rand(User.count)).first
   (0.2ms)  SELECT COUNT(*) FROM "users"
  User Load (0.4ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ?  [["LIMIT", 1], ["OFFSET", 7]]
=> #<User id: 8, email: "lynn@brown.com", crypted_password: "$2a$10$YRLNEYKaaKRGK8nxXtRswepjPOpPnYh6BpGtGn83s3V...", salt: "itNNoQ9ZziCMd-pE3CnF", last_name: "後藤", first_name: "蒼", created_at: "2021-09-05 18:37:47", updated_at: "2021-09-05 18:37:47", avatar: nil, reset_password_token: nil, reset_password_token_expires_at: nil, reset_password_email_sent_at: nil, access_count_to_reset_password_page: 0, role: "general">

以下のコマンドでダミーデータをDBに投入します。

$ bundle exec rails db:seed

参考記事

【Rails】seeds.rbとFakerを使ってダミーデータ作ってみた
GitHub - faker-ruby/faker: A library for generating fake data such as names, addresses, and phone numbers.
A library for generating fake data such as names, addresses, and phone numbers. - GitHub - faker-ruby/faker: A library for generating fake data such as names, a...
Fakerを使ってダミーデータを作る【Day 8/30 2nd】|Kentarotawara
こんにちは、たわらです。 本記事はFakerを使ってダミーデータを作る手順の情報を整理したものです。 ますは gem Faker をインストールしておきます。 faker-ruby/fakerA library for generating fake data such as names, address...
【Rails】seeds.rbとFakerを使ってダミーデータ作ってみた

コメント

タイトルとURLをコピーしました