rails db:seed で CSV ファイルから初期データを登録する

rails db:seed で登録する初期データを CSV ファイルで管理するコードを書いたのでご紹介します。

Ruby on Rails | ルビーオンレイルズ

本記事でやること

  • seed をモデル名を指定して実行できるようにする
  • seed ファイルを db/seeds.rb とは別にを複数ファイルに分割する
  • seed を CSV ファイルで管理する
  • ついでに rails db:seed でも登録できるようにする

seed をモデル名を指定して実行する rake タスク追加

lib/tasks/seed.rake を以下のように作成します。

Dir.glob(File.join(Rails.root, 'db', 'seeds', '*.rb')).each do |file|
  desc "Load the seed data from db/seeds/#{File.basename(file)}."
  task "db:seed:#{File.basename(file).gsub(/\..+$/, '')}" => :environment do
    load(file)
  end
end

モデル毎に seed ファイル作成

db/seeds ディレクトリを作成して、その下にモデル毎の seed ファイルを作成します。

例えば Tag モデルに関しては tag.rb と作成します。ファイル名の命名規則は app/models/tag.rb と統一しました。

db/seeds/tag.rb

require "csv"
 
CSV.foreach("db/seeds/csv/tag.csv", headers: true) do |row|
  Tag.create(name: row[0], description: row[1])
end

モデル毎に CSV ファイル作成

まず、db/seeds/ 以下に csv ディレクトリを作成します。

mkdir db/seeds/csv/

次に、CSV ファイルを適当に用意して db/seeds/csv/tag.csv を保存しましょう。

CSV ファイルの管理方法ですが、自分の場合は非エンジニアでも簡単に編集できるように Google スプレッドシートで管理して、CSV ファイルにエクスポートすることにしました。

実行方法

モデル名を指定して実行する

今回作成した rake タスクで、以下のように rake db:seed:modelname の形式で、モデル名を指定して実行できます。

bundle exec rake db:seed:tag

rails db:seed で一括実行

上記で追加したモデル毎の seed ファイルを db/seeds.rb で require するだけで OK です。

db/seeds.rb

require "./db/seeds/tag.rb"

rails db:seed コマンドで一括登録できるようになります。

以上、初期データを CSV ファイルで管理して rails db:seed で登録したい、現場からお送りしました。

参考情報