upsert_allメソッドを使って手軽に更新できるrails db:seedコマンドを作る

Railsで開発環境のデータを追加するrails db:seedコマンドの中身で、Rails 6で追加されたupsert_allメソッドを使うと、後から何度でも上書き更新できるコマンドにできて便利な印象があるので、実装例をサラッと書いておきたい。

seedsをCSVで用意する

データの形式は何でも良いのだけれど、RDBのレコードに対応するデータはCSV形式で書くのが直感的で扱いやすい印象があるので、今回はCSVで登録する方式とする。db/seedsディレクトリ下に、"#{テーブル名}.csv"命名ルールでCSVファイルを作成し、ヘッダーにカラム名の形式で登録する。

seeds.rbでupsert_allで更新する

CSVの中身を、upsert_allの引数に指定できるhashの配列に変換する。upsert_allではcreated_atとupdated_atも指定する必要があるので、現在時刻を入れておく。

実行

bin/rails db:seed

これで後から何度でも上書き更新できるdb:seedコマンドができた。実行時間も短く収まる処理になっていると思う。