rails db:seed で CSV ファイルから初期データを登録する
- 2018 1/6
- カテゴリー : Ruby on Rails
- コメントを書く
rails db:seed で登録する初期データを CSV ファイルで管理するコードを書いたのでご紹介します。
本記事でやること
- 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 で登録したい、現場からお送りしました。
参考情報
- Railsでseedデータを分割して実行できるようにする – Passion make things more better
- Rails・seedファイルを分割して管理する – Qiita
- rake db:seedを使ったデータの投入 – Qiita