はじめに
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!を使うワケ
create
はtrue
かfalse
を返すメソッドなので、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
参考記事



コメント