Railsでデータベースシーディング をやってみた | Dev Driven 開発・デザインチーム Railsでデータベースシーディング をやってみた | 働くひとと組織の健康を創る iCARE

BLOG

Railsでデータベースシーディング をやってみた

2020/08/28

機能追加や、検証していると開発でデータベースをリセットが必要の場合が度々起こってきます。初期だとまだ機能検証で動作確認も含め、手動でデータを作ります。しかしアプリが複雑化するにつれ手動で一々作るのは非効率で面倒臭い上、リセットする必要性も増えて来ました。

なのでrailsのdb/seeds.rbで勝手にダミーデータを作ってもらえるよう自分のアプリのセットアップをご紹介します。

プロジェクトのER図

ER図(2020/08/27更新)
alphablog-erd

* 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 の例
seed_for_article