ポケモンのデータをDBに突っ込んでみた

こんにちは!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を検索して同一のレコードが無ければ保存、という処理をしています。
あとは値を一つずつそれぞれのカラムに保存するだけです。


もっと綺麗に書ける気はするが、、、