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
- 無料・簡単・片手でホームページを作成できる自社サービス Rakwi
- Web制作とアプリ開発を学べるオンラインプログラミング講座 Upstairs
- 開発,DX推進支援サービス スタートアッププラン