Railsのseedまとめ

seed

Railsのseedについてまとめました。

seedとは

seedとは初期データを投入するための仕組み。

db/seeds.rbに作りたいデータを定義する記述をし、rails db:seedを実行して実際にデータを生成する。

前提

バージョン

Ruby 3.2.2 Rails 7.1.3

テーブル設計

名前、メールアドレス、パスワードを持つusersテーブルのデータを作るとする。

テーブル例

users
id
name
email
password

マイグレーションでテーブルを作成するが詳しい手順については省略。

データを1件だけ作成する

db/seeds.rbに以下の記述をする。

User.create!(
  name: 'test',
  email: 'test@example.com',
  password: 'password',
)

create!とすることで、エラーが起きた時に例外を発生させる。createとすると、単にfalseを返すだけなので問題を検出しづらい。

記述できたら、rails db:seedコマンドを実行して、初期データを生成する。

複数のデータを作成する

複数のデータを作成するにはtimesを使う。

# 10件のユーザーのデータを作成する
10.times do |n|
  User.create!(
    name: "test#{n + 1}",
    email: "test#{n + 1}@example.com",
    password: 'password',
  )
end 

複数のデータを作る時は重複が許されないデータに注意する。

関連するテーブルのデータを作成する

ユーザーと関連する商品のデータを作るとする。

テーブル例

products
id
user_id
name
price
description

マイグレーションは省略。

db/seeds.rbに以下の記述を追記する。

# ユーザーのデータを作る
user = User.create!(
  name: 'test',
  email: 'test@example.com',
  password: 'password',
)

# ユーザーの持つ商品のデータを作る
product = user.products.create!(
  name: 'テスト',
  price: 1000,
  description: 'テストテストテストテストテスト'
)

Faker

Fakerというgemを使うことで、ランダムのデータを作成できる。

Gemfileに以下の記述を追加し、bundle installを実行する。

group :development, :test do
  gem 'faker'
end

group :development, :test do ~ endとすることで、開発環境とテスト環境の両方で使うようにする。

インストールできたら、試しにユーザーの名前とメールアドレスをランダムなもので生成する。

# 10件のユーザーのデータを作成する
10.times do |n|
  User.create!(
    name: Faker::Name.name
    email: Faker::Internet.email
    password: 'password',
  )
end 

rails cでデータが作られているかチェックする。

User.allを実行し、すべてのユーザーのデータを取得する。

rails c
Loading development environment (Rails 7.1.3)
irb(main):001> User.all
  User Load (0.1ms)  SELECT "users".* FROM "users" /* loading for pp */ LIMIT ?  [["LIMIT", 11]]
=>
[#<User:0x0000000107af6df8
  id: 1,
  name: "Kortney Turner",
  email: "romona.wilkinson@russel.example",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.639596000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.639596000 UTC +00:00>,
 #<User:0x0000000107ff5520
  id: 2,
  name: "Amb. Jeannie Kihn",
  email: "guy@schumm-flatley.example",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.642269000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.642269000 UTC +00:00>,
 #<User:0x0000000107ff53e0
  id: 3,
  name: "Kerrie Graham",
  email: "halley_grady@welch.test",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.644161000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.644161000 UTC +00:00>,
 #<User:0x0000000107ff52a0
  id: 4,
  name: "Myrtle Schumm",
  email: "dannie_gleichner@prohaska.example",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.646000000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.646000000 UTC +00:00>,
 #<User:0x0000000107ff5160
  id: 5,
  name: "Elisabeth Wyman",
  email: "leeanna_casper@schaefer.test",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.647842000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.647842000 UTC +00:00>,
 #<User:0x0000000107ff5020
  id: 6,
  name: "Pres. Hayley Gleichner",
  email: "bethany@jacobson-hickle.test",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.649733000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.649733000 UTC +00:00>,
 #<User:0x0000000107ff4ee0
  id: 7,
  name: "Kimiko Deckow",
  email: "eloy.walsh@fritsch-hodkiewicz.test",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.651587000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.651587000 UTC +00:00>,
 #<User:0x0000000107ff4da0
  id: 8,
  name: "Coleman Kling",
  email: "emelia@boehm-kshlerin.test",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.653409000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.653409000 UTC +00:00>,
 #<User:0x0000000107ff4c60
  id: 9,
  name: "Azzie Funk",
  email: "fonda_trantow@berge-hayes.example",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.655242000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.655242000 UTC +00:00>,
 #<User:0x0000000107ff4b20
  id: 10,
  name: "Son Mayert",
  email: "trenton_waelchi@wilkinson-oberbrunner.test",
  password: "[FILTERED]",
  created_at: Tue, 13 Feb 2024 13:22:05.657033000 UTC +00:00,
  updated_at: Tue, 13 Feb 2024 13:22:05.657033000 UTC +00:00>]

ユーザーの名前とメールアドレスがランダムに生成されていることが確認できる。