seed
Railsのseedについてまとめました。
seedとは
seedとは初期データを投入するための仕組み。
db/seeds.rb
に作りたいデータを定義する記述をし、rails db:seed
を実行して実際にデータを生成する。
前提
バージョン
Ruby 3.2.2 Rails 7.1.3
テーブル設計
名前、メールアドレス、パスワードを持つusersテーブルのデータを作るとする。
テーブル例
users |
---|
id |
name |
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>]
ユーザーの名前とメールアドレスがランダムに生成されていることが確認できる。