はじめに
アプリの初期データ用のseed ファイルを開発環境別に管理する必要があったので備忘録です。
環境
- macOS 10.15.6
- Ruby 2.5.7
- Rails 5.2.3
- rspec-rails 4.0.1
- capybara 3.32.2
参考URL
https://pikawaka.com/rails/env
https://prokyou.com/rails/seeds/
https://qiita.com/kimihito_/items/753390a5fe42a41b1d60
https://qiita.com/mogya/items/76430e32ffca1ef93f27
目標
- 開発環境別でseed ファイルを管理できる
- seed ファイルの修正後に環境別に初期データを追加/削除ができる
実装
1. seeds ディレクトリを作成
通常のRails アプリでのseed ファイルのディレクトリはdb/seeds.rb
です。
これを以下のように修正します。
#修正前
db/seeds.rb
#修正後
db/seeds/development.rb #追加
db/seeds/test.rb #追加
db/seeds/production.rb #追加
db/seeds.rb
-
seeds
ディレクトリの中に環境別のseed ファイルを作成 - 元々あったseeds.rb の中身は現時点ではそのままでok
2. 環境別にseed ファイルを作成
元々あったseeds.rb の中身を元にして各環境別に初期データ用の処理を追加します。
私の場合はCSV を使った初期データをテスト環境でも使いたかったのでtest.rb に下記を追加しました。
development.rb は元々あったseeds.rb を複製しました。
#Country CSV import
require "csv"
CSV.foreach("country.csv", headers: true) do |row|
Country.create!(
country_name: row["国・地域名"],
region: row["場所"]
)
end
3. seeds.rb に読み込み処理を追加
環境別にseed ファイルが準備できたので各ファイルの読み込み処理をseeds.rb に追加します。
初期データ追加用の処理は各環境別に分けているはずなので削除してokです。
#環境別にseed ファイルを読み込む
load(Rails.root.join("db", "seeds", "#{Rails.env.downcase}.rb"))
#元の初期データ追加の処理は削除
seed ファイルの読み込みディレクトリを指定しています。
#seeds.rb の読み込み処理の詳細
load(Rails.root.join("親ディレクトリ", "子ディレクトリ", "#{開発環境名.downcase}.rb))
4. 環境別にseed ファイルで初期データを導入
環境別にseed ファイルを読み込んで初期データを導入します。
初期データを削除してseed ファイルを読み込みます。
# development 環境の初期データ削除
$ rails db:migrate:reset
# development 環境の初期データ追加
$ rails db:seed
# test 環境の初期データ削除
$ rails db:migrate:reset RAILS_ENV=test
# test 環境の初期データ追加
$ rails db:seed RAILS_ENV=test
5. コンソールで導入されたデータの確認
環境別にコンソールを立ち上げて初期データの件数を確認します。
-e
オプションをつける事で環境別にコンソールを立ち上げます。
#development 環境で初期データ件数の確認
$ rails console
Loading development environment (Rails 5.2.3)
> Country.count
249
#test 環境で初期データ件数の確認
$ rails console -e test
Loading test environment (Rails 5.2.3)
> Country.count
249
学び
- 環境別にseed ファイルを用意する事で初期データの管理が楽になった
- テスト用の初期データにseed を使うのは一部だけにして、テストに必要なデータはなるべくfixture を使う方が良さそうです