こんにちは!kossyです!
さて、今回はRailsとAngularの練習用に作ろうと模索しているポケモン図鑑APIの基になる、
ポケモンのマスタデータをDBにimportした時の備忘録をブログに残してみたいと思います。
環境
Rails 5.2.3
Ruby 2.5.1
MacOS Mojave
マスタデータ用意
今回使用したマスタデータはこちらのサイトから拝借しました。
ポケモンの種族値データシートの配布【第7世代】 - 理科系のトレーナー
私はメガシンカなんぞよく知らない世代なので、
メガシンカを図鑑から抜いたCSVデータを作成しました。
それがこちらです。
https://docs.google.com/spreadsheets/d/1Wc-bw_wq_t2IqfzoTfHE3_2cGFJtd3On5Y7IAh6EujY/edit#gid=1634117797
これをRubyの標準ライブラリであるcsvを用いて、DBにimportします。
実装
dbディレクトリ下にmaster_filesというディレクトリを用意し、先ほど用意したcsvファイルを置いておきます。
次に、db/seeds.rbに以下のコードを書きます。
require 'csv' CSV.foreach("db/master_files/pokemon.csv", headers: true) do |csv| Pokemon.find_or_create_by! number: csv[0].to_i, name: csv[1], type_1: csv[2], type_2: csv[3], hp: csv[4].to_i, attack: csv[5].to_i, defense: csv[6].to_i, sp_attack: csv[7].to_i, sp_defense: csv[8].to_i, speed: csv[9].to_i, total: csv[10].to_i end
csvライブラリは明示的にrequireしないと使用できないので、requireしています。
CSV.foreachで第一引数に指定したcsvファイルを一行ずつ読み込みます。headers: trueを指定すると、最初に読みこむ行をCSVのヘッダーと見なすようになります。
find_or_create_by! メソッドで、DBを検索して同一のレコードが無ければ保存、という処理をしています。
あとは値を一つずつそれぞれのカラムに保存するだけです。
もっと綺麗に書ける気はするが、、、