テクノロジー
2018年12月28日シードデータの作り方について
自分で作成しているアプリケーションに、実験用のデータを入れたい時みなさんはどうしているでしょうか?
データを一括で大量作成する、シードデータの作り方について
自分で作成しているアプリケーションに、実験用のデータを入れたい時みなさんはどうしているでしょうか?
例えば、1000件のデータが欲しいという際に、一つひとつのデータを手打ちしていたのではとても手間がかかってしまいますよね。
今回の記事では、そんな時に自動でデータを入力してくれるシードデータ
の作り方をご紹介していきます。
シードデータとは
レコードを作成するのには、様々な方法が存在します。
例えば rails console
を用いてレコードを1つずつ挿入していく方法があります。
rails c
2.3.0 :001 > Blog.create(title: "ブログ始めました", content:"冷やし中華始めました!")
2.3.0 :002 > Blog.all
ただそれだと、最初に書いたように、多くのデータを挿入する必要があるとき、とても時間がかかってしまいます。
そこで 一度に多くのレコードを生成
する方法があります。
それが シードデータ
です。
シードデータを作るには
シードデータは db/seeds.rb
に記述し、以下のコマンドを実行することで実現することができます。
(コンソール
)
rake db:seed
実際にシードデータを投入する
では実際にレコードを挿入してみましょう。
まずは db/seeds.rb
に以下を記述します。
(db/seeds.rb
)
Blog.create(title: "ブログまた始めました", content:"みそラーメン始めました!")
Blog.create(title: "ブログまたまた始めました", content:"とんこつラーメン始めました!")
次にコンソールで下記コマンドを実行します。
rake db:seed
正常に実行されると、特に何も表示されません。
ではrails cを使って、Blogモデルにレコードが挿入されているか確認してみましょう。
rails c
2.3.0 :001 > Blog.all
しっかりと挿入されていることが確認できました。
ここでもう一度、コンソールで rake db:seed
を実行します。
rails cを使って、Blogモデルのレコードの状態を確認してみます。
すると先ほどと同じレコードがが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
問題なくレコードが挿入されていそうです。
しかし途中から省略されてしまうので、しっかりと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となっています。
以上で、シードデータの説明を終わります。シードデータは数百数千のレコードを一気に作成してくれる優れものですので、ぜひ使い方を覚えてみてください!