Railsでデータベースシーディング をやってみた
機能追加や、検証していると開発でデータベースをリセットが必要の場合が度々起こってきます。初期だとまだ機能検証で動作確認も含め、手動でデータを作ります。しかしアプリが複雑化するにつれ手動で一々作るのは非効率で面倒臭い上、リセットする必要性も増えて来ました。
なのでrailsのdb/seeds.rbで勝手にダミーデータを作ってもらえるよう自分のアプリのセットアップをご紹介します。
プロジェクトのER図
ER図(2020/08/27更新)
* required
U unique
(rails-erd gem で作ってくれます。)
プロジェクトへのリンク:
https://github.com/helenxfu/alpha_blog/
(アルファプロジェクトなのでプロダクションdeployはする予定はございません。動かしたい方はgithubでpullしてlocalでお願いします。)
必要なデータ
User(内adminを一人)
Category
Article:Userに紐付いた記事(Categoryにも紐ずく:ランダムで0からいくつかのcategoryに所属)
Micropost: UserのTweetみたいな物
Faker gem
ダミーデーターをランダムに生成してくれるgem です。
gem link
loremだけではなく、email, 名前、住所、日付、色やコーヒー、スポーツ関連のデータも作れます。
セットアップ
# 方便上admin user を最初に一人作っています。
# create admin
User.create!(username: "Admin User",
email: "admin@test.test",
password: "foobar",
admin: true,
activated: true,
activated_at: Time.zone.now)
# 20人usersを作ります。usernameとemailが被らないように"unique"を作ります。
# create seed users
20.times do |n|
username = Faker::Name.unique.name[0..24]
email = Faker::Internet.unique.email
password = "password"
User.create!(username: username, email: email, password: password, activated: true, activated_at: Time.zone.now)
end
# articleと紐ずくcategoryをuniqueで15個作ります。25文字までの設定なので、fakerで帰ってくる値が長すぎる場合切り落とします。
# create seed categories
15.times do
category = Faker::Educator.unique.subject[0..24]
Category.create!(name: category)
end
#最初の4userをセレクトしてデータを入れていきます。
users = User.order(:created_at).take(4)
# 長さ制御はrandom設定します。
# sentence_count: rand(1..4) はランダムに1から4行追加します。長さ300まで。
# create seed articles
users.each do |user|
15.times do
title = Faker::Lorem.characters(number: rand(3..100)) # min: 3 max: 100 length
description = Faker::Lorem.paragraph(sentence_count: rand(1..4))[0..299] # randomly 1~4 sentences, up to length of 300
# categoryを被らせずにランダムに0~4個紐づかせます。
category_ids = (1..15).to_a.sample(rand(5)) # up to 4 categories
user.articles.create!(title: title, description: description, category_ids: category_ids)
end
end
# create seed microposts
users.each do |user|
50.times do
content = Faker::Lorem.sentence(word_count: rand(1..5))
user.microposts.create!(content: content)
end
end
db:seed 実行
rails db:seed で走らせます。
全てのレコードを空にしてデータベースの初期化すれば、またseedをやり直せます。
DBを空にしてやり直す場合db:reset でDBをdropして再びseedしてくれます。
結果
userがランダムにgenerateされて、
内最初の4userにarticleを作り(一人目はadmin)、カテゴリーをランダムに所属させて、tweetさせた。
図:User.find_by(username: "Admin User").articles の例