rails db:seed で登録する初期データを CSV ファイルで管理するコードを書いたのでご紹介します。
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
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
まず、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
上記で追加したモデル毎の seed ファイルを db/seeds.rb で require するだけで OK です。
db/seeds.rb
require "./db/seeds/tag.rb"
rails db:seed コマンドで一括登録できるようになります。
以上、初期データを CSV ファイルで管理して rails db:seed で登録したい、現場からお送りしました。