emolog

脳内メモです。

【rails】 seedデータ投入時に、csvをimportしてよしなにする

seed_data投入をいい感じにやりたかったので、メモ seeds.rbに全部入れるのは見通しが悪くなるのでやめたい。

f:id:ababababa0222:20210308172835p:plain

やりたいこと

  • csvファイルに、seed_data用のファイルを定義
  • そのファイルを読み込んでseed_dataとして投入
  • bundle exec rails db:seed で実行される

やったこと

  • dbディレクトリのseeds配下に元データとなる csv と実行する script ディレクトリを定義した
  • seeds.rbでscript配下のrubyファイルを実行するイメージ
├── migrate
├── schema.rb
├── seeds
│   ├── csv
│   └── script
└── seeds.rb
  • seeds.rb をseed配下のスクリプトを実行するように変更
    • ソートはファイル名で
    • データ投入の順序を制御したくなると思うので 01_user.rb みたいして、それで制御する
require "csv"

Dir[File.join(Rails.root, 'db', 'seeds', 'script', '*.rb')].sort.each do |seed|
  load seed
end

スクリプトを定義

  • db/seeds/script/01_user.rb
CSV.foreach('db/seeds/csv/01_user.csv', headers: true) do |row|
  Room.create!(
    name: row['name']
  )
end

データを定義

  • db/seeds/csv/01_user.csv
name
emono

これで bundle exec rails db:seed をするとデータが投入される