【Rails】開発/本番環境で違う初期データ(seeds.rb)を入れる、データの入れ直し方法など

# はじめに

初のオリアプ開発で、開発環境でユーザー等のテスト用の初期データを大量に生成する必要があったのと、本番環境でもデモ用初期データを手動追加するのが面倒なので、何かいい方法はないかと考えてました。  
というのも、私の今作っているアプリは複数のユーザーモデルやメインとなるデータモデルを前提としている機能が多いんですよね。  
調べたらseed.rbを活用すると初期データを入れられるとのことで、ではやってみよう！となったのです。

## 前提

- Ruby 3.2.0
- Rails 7.0.8
- 本番環境はRender
- Renderにて既にデプロイが出来ていること

# seeds.rbファイルとは？
データベースに初期データを設定するために使用されるファイルです。  
このファイルに記述されたコードは、rails db:seedコマンドを実行することで実行され、指定されたデータがデータベースに追加されます。  

# ディレクトリ構造
元々は以下のようになっていると思います。
```
db
├── migrate
├── seeds.rb
└── schema.rb
```
以下のような構造にします。
```
db
├── migrate
├── seeds
│   ├── development.rb
│   └── production.rb
├── schema.rb
└── seeds.rb
```
- development.rbが開発環境用
- production.rbが本番環境用

# seeds.rbの記述
プロジェクトの環境（開発、本番）に応じて異なるseedファイルを読み込むための記述をします。  
他のテストデータの生成をする記述は、先ほど作成した環境ごとのファイルに記述しますのでここでは1行書くだけで大丈夫です。
```ruby:db\seeds.rb
load(Rails.root.join("db", "seeds", "#{Rails.env.downcase}.rb"))
```

# production.rbにテストデータの記述をする
ご自身にあった内容で記述してください。  
例えばこんな感じの記述をします。
```ruby:db/seeds/production.rb
# ユーザーデータの例
User.create!(
  name: "本番テストユーザー1",
  email: "test1@example.com",
  password: "password",
  password_confirmation: "password"
)

# 商品データの例
Product.create!(
  name: "テスト商品",
  description: "これはテスト用の商品です。",
  price: 1000
)
```

# render-build.shとは？
Render用のRailsセットアップスクリプトファイルです。
render-build.sh という命名は以前教材で習ったものを流用しているだけです。  
中身はRailsアプリケーションをRender(本番環境)で動かすための準備作業を自動化するためのものという認識でいいです。

# 本番環境に初期データを入れる
seeds.rbを適用する前のrender-build.sh の記述はこちらです。
```ruby:\bin\render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
```
データが既に入っていることを想定して一度リセットしておきます。  
以下の記述にしたら本番環境に反映させてください。
```ruby:\bin\render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
# bundle exec rake db:migrate ←コメントアウトする
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
```
次に初期データの投入をします。  
以下のように記述したあと、本番環境に反映させてください。
データを入れ直したいときはリセット→投入をやるだけです。  
交互にコマンドを使うので、コメントアウトのし忘れに注意してください。別に丸々消してもいいです。
```ruby:\bin\render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate # マイグレーションの実行
rails db:seed RAILS_ENV=production #本番環境のデータベースに初期データを投入
# DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
```
毎回実行する必要はないので、本番環境への反映が確認できたらコメントアウトか消しておきましょう。
```ruby:\bin\render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
# rails db:seed RAILS_ENV=production ←普段はコメントアウトしておく
# DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
```

# 開発環境で初期データの入れ直しをする
これも同じようなやり方です。  

①development.rbにユーザーの生成など必要な初期データを生成する記述をする  

②ターミナルでrails db:migrate:reset
```:ターミナル
rails db:migrate:reset
```
③ターミナルでrails db:seed
```:ターミナル
rails db:seed
```
初めて投入する時は②を飛ばして③をやればいいです。  

# 私の活用方法
  
用途は、主に以下の2つです。
- 挙動確認
- 本番用のデモデータ

本番環境に反映させる前に、開発環境でテストデータの生成ができているどうかを確認してから本番環境に同じ記述をコピペしています。  
ユーザーだけでなく、投稿データやpdf等のファイルデータも投入できるので、デモデータ用途としても便利です。

# 参考にした記事
[[Rails]開発・本番環境それぞれに違うSeedデータ投入方法](https://zenn.dev/airiswim/articles/040640884120ab)



# 最後に
少し前に導入しているので、記憶違いやなにか書き漏れがあるかもしれません。  
この内容が誰かの役に立てれば幸いです。