テクノロジー

2018年12月28日

シードデータの作り方について

Aws4 request&x amz signedheaders=host&x amz signature=752cfcd1c6e6f0d3f02096c7b3393ad80da41699908786b58cddb1b4e0065964

データを一括で大量作成する、シードデータの作り方について

自分で作成しているアプリケーションに、実験用のデータを入れたい時みなさんはどうしているでしょうか?
例えば、1000件のデータが欲しいという際に、一つひとつのデータを手打ちしていたのではとても手間がかかってしまいますよね。

今回の記事では、そんな時に自動でデータを入力してくれるシードデータの作り方をご紹介していきます。

シードデータとは

レコードを作成するのには、様々な方法が存在します。
例えば rails console を用いてレコードを1つずつ挿入していく方法があります。

rails c
2.3.0 :001 > Blog.create(title: "ブログ始めました", content:"冷やし中華始めました!")

https://diveintocode.gyazo.com/98a03ba28ca75dbf326961a9384e6b88

2.3.0 :002 > Blog.all

https://diveintocode.gyazo.com/82ecaca9b7d86be796da855090b53485

ただそれだと、最初に書いたように、多くのデータを挿入する必要があるとき、とても時間がかかってしまいます。

そこで 一度に多くのレコードを生成 する方法があります。
それが シードデータ です。

シードデータを作るには

シードデータは db/seeds.rb に記述し、以下のコマンドを実行することで実現することができます。

(コンソール)

rake db:seed

実際にシードデータを投入する

では実際にレコードを挿入してみましょう。
まずは db/seeds.rb に以下を記述します。

(db/seeds.rb)

Blog.create(title: "ブログまた始めました", content:"みそラーメン始めました!")
Blog.create(title: "ブログまたまた始めました", content:"とんこつラーメン始めました!")

次にコンソールで下記コマンドを実行します。

rake db:seed

https://diveintocode.gyazo.com/53c563dfa3d8c6fa8bb27e19495d77e5

正常に実行されると、特に何も表示されません。
ではrails cを使って、Blogモデルにレコードが挿入されているか確認してみましょう。

rails c
2.3.0 :001 > Blog.all

https://diveintocode.gyazo.com/bfd674bad2173a5c3ca68afbef1b5a18

しっかりと挿入されていることが確認できました。

ここでもう一度、コンソールで rake db:seed を実行します。
rails cを使って、Blogモデルのレコードの状態を確認してみます。

https://diveintocode.gyazo.com/1a9f0f58660dd5df099e24f9724f2007

すると先ほどと同じレコードがが2つずつ作成されていることがわかります。
つまり rake db:seed を実行するたびに db/seeds.rb の処理が実行されるということになります。

大量のシードデータを作成する

先ほど行った方法では100件分のデータを投入するには100回Blog.crete()と記載する必要があります。
そこで ループ文 を使うことで、一度に大量のレコードを挿入することができます。
今回は timesメソッド を用いて実装します。

まずは db/seeds.rb に書かれているコードをすべて削除して下記コードを書いてみましょう。

(db/seeds.rb)

100.times do |n|
  Blog.create(title: "ブログ始めました#{n}回目", content:"ラーメン食べました!#{n}回目")
end

timesメソッドにより、nに0から99まで順に代入され、createメソッドを100回繰り返し実行することができます。

コンソールで下記コマンドを実行します。

rake db:seed

Blogモデルのレコードを確認してみましょう。

rails c
2.3.0 :001 > Blog.all

https://diveintocode.gyazo.com/3fa8fd5ea83bef037f277875ac769567

問題なくレコードが挿入されていそうです。
しかし途中から省略されてしまうので、しっかりと100レコードあるか確認しましょう。
countメソッドを使うことでレコード数を調べることができます。

2.3.0 :002 > Blog.count

今回であれば104レコード挿入されていることが確認できました。

Faker

これまでの方法だと、ブログ始めました1回目、ブログ始めました2回目、ブログ始めました3回目、・・・といったように、各レコードのバリエーションに欠けています。

そこで 実際に存在しそうなデータをランダムで生成してくれるgem があります。
これが Faker です。

生成してくれるデータは名前や住所やメールアドレスなど様々です。

種類 役割
Faker::Name.name 名前
Faker::Internet.email メールアドレス
Faker::Address.city 都市の名前
Faker::Food.ingredient 食べ物の名前

まずはライブラリをインストールしましょう。

(Gemfile)

gem 'faker'

次に以下ファイルに書かれているコードをすべて削除して下記コードを書いてみましょう。

(db/seeds.rb)

50.times do |n|
  name = Faker::Name.name
  email = Faker::Internet.email
  content = "Hogehoge"

  Contact.create(
    name: name,
    email: email,
    content: content
  )
end

コンソールで下記コマンドを実行します。

rake db:seed

ではレコードを確認してみましょう。

rails c
2.3.0 :001 > Contact.all

このように実際に存在しそうなレコードを挿入することができます。Fakerのgemはシードデータと絡めてよく使われるgemとなっています。

以上で、シードデータの説明を終わります。シードデータは数百数千のレコードを一気に作成してくれる優れものですので、ぜひ使い方を覚えてみてください!

DIVE INTO CODEのことをもっと知ってみませんか?