Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?
@hirokun0204

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に反映させることができます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?