seedを使って、DBにデータをインポートする


seedファイルとは

seedファイルは、初期データをDBに入れる時に使うファイルのことです。
何かのアプリを作成する場合に、作成したDBにデータ(ユーザ登録データなど)を入れる際に使います。
1件づついれる方法もあれば、CSVファイルなどでデータをまとめてインポートすることもできるので、何かと重宝するファイルです。
この記事では、私が学習した基本的なseedの使い方とCSVファイルをインポートする方法をアウトプットしていきます。
なお、テーブルの作成やマイグレーションファイルの作成方法などは省略します。

学習環境

MacOS BigSur
Ruby 2.6.5
Ruby on rails 6.0.3.6
Mysql 5.6.51

基本形

ここでは、「Hansoku」という名前のモデルを作成しており、マイグレーションファイルには、

20210416141031_create_hansokus.rb
class CreateHansokus < ActiveRecord::Migration[6.0]
  def change
    create_table :hansokus do |t|
      t.string :hansoku_name,           null: false
      t.integer :damage,                null: false
      t.string :status,                 null: false
      t.timestamps
    end
  end
end

と記載しているとします。
そのモデルに対して、カラム名に応じて、保存したい値をseed.rbに以下のようにcreateメソッドの引数に保存したい値を定義してあげます。

seed.rb
Hansoku.create(
  :hansoku_name => "金テキ", 
  :damage => 100, 
  :status => "動けない"
)

この形が基本的な形です。
個別に複数作成する場合は、配列形式にしてやり、

seed.rb
Hansoku.create[(
  :hansoku_name => "金テキ", 
  :damage => 100, 
  :status => "動けない"
),(
  :hansoku_name => "目つぶし", 
  :damage => 60, 
  :status => "動けない"
)]

などと記載してあげます。

CSVファイルをインポートする

次に、大量のデータをDBに初期データとして導入する方法として、CSVファイルをインポートする方法があります。
seedファイルにCSVファイルを読み込み、DBにインポートするのです。

require 'csv'

CSV.foreach('db/hansoku.csv', encoding: 'Shift_JIS:UTF-8') do |hansoku|
  Hansoku.create(
    :hansoku_name => hansoku[0], 
    :damege => hansoku[1], 
    :status => hansoku[2], 
  )
end

標準ライブラリのCSVライブラリを呼び出し、.foreachメソッドforeachメソッドについてはこちらを使用します。
このメソッドは、CSVファイルの各行がブロック変数に渡され、モデルに定義したカラムを「,」区切りのCSVファイルの左から順番に配列の添字で指定することができます。
上記コードで説明すると、

:hansoku_name => hansoku[0], 
  # インポートするCSVファイルの最初のカラムはモデルの「:hansoku_name」へ
:damage => hansoku[1], 
  # インポートするCSVファイルの2番目のカラムはモデルの「:damage」へ
:status => hansoku[2] 
   # インポートするCSVファイルの3番目のカラムはモデルの「:status」へ

といった感じでインポートされることになります。
なお、CSVファイルは指定されていないと文字コードのエンコード方式がshift-jisになっているので、エンコーディングが必要な場合は、変換させないとエラーが発生します。

最後にこのコマンド

seedファイルに記載した後は、

rails db:seed

のコマンドを実行してあげると、seedに書かれた内容をDBに反映させることができます。