Seedデータが次第にメンテナンスされなくなっていくことがよくある。 たいていテーブルスキーマを変更した際の漏れが積み重なったものであり、実装者もレビュワーも次第に意識が薄れていってしまう。 テストを書くプロジェクトだと必然とテストデータを作成するため、スキーマの変更に伴ってテストデータもメンテナンスされる。 また、テストデータの作成にFactoryBotを使用している場合は、初期値やtraitにテストデータの仕様が定義されている。 このようなメンテナンス上のメリットからSeedデータの作成にFactoryBotを活用している事例がいくつかある。
一方で、FactoryBotを開発しているThoughtBot社は、以下の理由から「Seedデータの作成にFactoryBotを使うことを推奨しない」ということをブログで述べている。
- The default attributes of a factory may change over time.
- Attributes may be added, renamed, or removed.
- Data will still need to be checked for presence before insertion.
https://thoughtbot.com/blog/factory_bot-for-seed-data
ローカル環境用のSeedデータの作成に活用すると便利と紹介されていたりもする。。
個人的には、非推奨であることを考慮してもデータ作成の効率性やメンテナンス性でのメリットが大きいと思っている。 プロジェクトへの導入も検討していきたいが、考慮すべき点があったので、まとめていきたい。(現状の考慮点なので、検証しながら新しく出たものについては随時追記する予定)
ローカル環境でのFactoryBotを使ったSeedデータの作成は、特に問題なく実現することが可能である。 ただし、テスト用の環境がリモートホスト(ステージングやプレビュー環境)にあるとして、そこを対象にしてSeedデータを作成したくなった時にどうするか?
リモートホストへのSeedデータの流し込みにあたって
development
,test
モードに限られてしまうproduction
モードで動作する環境にspec
ディレクトリを含めない運用になっているような場合、Seederの実行に失敗してしまう。
factory_bot_rails
をproduction
モードでも動作するように設定を頑張ることも考えたが、余計なファイルや設定を複雑化することは避けたい。
また、
みたいなことも考えたが、development
モードからリモートホストのDBへ接続して、Seederを実行するのもありかも?と思ったので、運用方法を検討してみることにした。
database.yml
のdevelopment
ディレクティブをリモートホストのDBに接続するよう設定する。
例として、適当なRakeタスクを作成して、FactoryBotの定義を使用して適当なデータを作成してみる。
lib/tasks/hoge.rake
# frozen_string_literal: true
namespace :hoge do
task fuga: :environment do |_|
FactoryBot.create(:user, email: 'hoge@example.com')
end
end
config/database.yml
development:
<<: *default
url: <%= ENV["DATABASE_URL"] %>
ローカル環境(docker)からリモートホストに対してSeedデータの作成を行う場合
docker compose run --rm web rails hoge:fuga --env DATABASE_URL=databaseurl
リモートホスト間(アプリケーション←→DB)でSeedデータの作成を行う場合。(例としてHerokuを使っているとする)
DATABASE_URL
はHerokuのコンソール画面から環境変数として登録しておく。
※ /test
や/spec
ディレクトリを含んでデプロイされている前提。(運用次第で検討が必要)
heroku run bundle exec rails hoge:fuga RAILS_ENV=development -a アプリ名