csvファイルを作成し、初期データを挿入しよう[Rails]

# **はじめに**
railsで開発する際、あらかじめ用意しておいたデータをデータベースに挿入したい場面が多々あると思います。今回はその流れをまとめていきます。

Bookモデルを作成している前提で話を進めていきます。
（`rails g model book title:string`）

次の流れで進めていきます。
1. seeds.rbファイルにアルゴリズムを作成する
2. csvファイルを作成する
3. コマンドを実行し、データをデータベースに挿入する

#**流れ**
## **1. seeds.rbファイルにアルゴリズムを作成する**

```seeds.rb
require "csv"

books_csv = CSV.readlines("db/books.csv")
books_csv.shift
books_csv.each do |row|
  Book.create(title: row[1])
end
```

1行目では、Rubyで用意されているcsvを扱うための、csvライブラリを呼び出しています。
**requrireを利用すると外部ライブラリを利用することが可能になります**。

次に、`readlines`メソッドを使って、、**ファイル内容を全て読み込んで、その各行を要素として持つ配列を返します。**

そして、`shift`メソッドにより、配列の先頭の要素を取り出します。破壊的なメソッドであるため、メソッド適用後は、先頭要素が除外された配列となっています。

## **2. csvファイルを作成する**

ここで、csvファイルの中身を作成します。

```books.csv
id,"title","created_at","updated_at"
1,"3ステップでしっかり学ぶRuby入門","0000-00-00 00:00:00","0000-00-00 00:00:00"
2,"プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで","0000-00-00 00:00:00","0000-00-00 00:00:00"
3,"プログラミング言語Ruby","0000-00-00 00:00:00","0000-00-00 00:00:00"
4,"初めてのRuby","0000-00-00 00:00:00","0000-00-00 00:00:00"
5,"メタプログラミングRuby","0000-00-00 00:00:00","0000-00-00 00:00:00"
6,"たのしいRuby","0000-00-00 00:00:00","0000-00-00 00:00:00"
7,"Effective Ruby","0000-00-00 00:00:00","0000-00-00 00:00:00"
8,"たった1日で基本が身につくRuby on Rails超入門","0000-00-00 00:00:00","0000-00-00 00:00:00"
9,"基礎 Ruby on Rails","0000-00-00 00:00:00","0000-00-00 00:00:00"
10,"オブジェクト指向設計実践ガイド - Rubyでわかる 進化し続ける柔軟なアプリケーションの育て方","0000-00-00 00:00:00","0000-00-00 00:00:00"
```
見ての通り、一行目はフィールドの項目ですので必要ないですね。
eachメソッドからの流れはよく目にする文法ですので、ここでは割愛します。


## **3. コマンドを実行し、データをデータベースに挿入する**

```
rails db:seed
```

<img width="809" alt="_MySQL_5_6_39__localhost_model_practice_development_books.png" src="https://qiita-image-store.s3.amazonaws.com/0/269862/3f5200a7-b170-47aa-c414-74e2439fc3a8.png">

これでデータベースにデータをインサートすることができました。


# **補足**
ついでに、csvファイルの各行を要素として収めた配列の中身を確認してみます。
console上で`ruby`コマンドを実行することにより確認することができます。
そこで、seeds.rbファイルを下記のように編集します。

```seeds.rb
require "csv"

books_csv = CSV.readlines("books.csv")
books_csv.shift
books_csv.each do |row|
  # Book.create(title: row[1])
end

p books_csv
```
実行結果は次のようになります。

```
$ ruby seeds.rb
[["1", "3ステップでしっかり学ぶRuby入門", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["2", "プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["3", "プログラミング言語Ruby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["4", "初めてのRuby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["5", "メタプログラミングRuby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["6", "たのしいRuby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["7", "Effective Ruby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["8", "たった1日で基本が身につくRuby on Rails超入門", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["9", "基礎 Ruby on Rails", "0000-00-00 00:00:00", "0000-00-00 00:00:00"], ["10", "オブジェクト指向設計実践ガイド - Rubyでわかる 進化し続ける柔軟なアプリケーションの育て方", "0000-00-00 00:00:00", "0000-00-00 00:00:00"]]
```

非常に見にくい結果となっているので、`pp`ライブラリを`require`で取り込みます。
次のように編集します。

```seeds.rb
require "csv"
require "pp"

books_csv = CSV.readlines("books.csv")
books_csv.shift
books_csv.each do |row|
  # Book.create(title: row[1])
end

pp books_csv
```

再度rubyコマンドを実行します。

```
$ ruby seeds.rb
[["1", "3ステップでしっかり学ぶRuby入門", "0000-00-00 00:00:00", "0000-00-00 00:00:00"],
 ["2",
  "プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで",
  "0000-00-00 00:00:00",
  "0000-00-00 00:00:00"],
 ["3", "プログラミング言語Ruby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"],
 ["4", "初めてのRuby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"],
 ["5", "メタプログラミングRuby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"],
 ["6", "たのしいRuby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"],
 ["7", "Effective Ruby", "0000-00-00 00:00:00", "0000-00-00 00:00:00"],
 ["8",
  "たった1日で基本が身につくRuby on Rails超入門",
  "0000-00-00 00:00:00",
  "0000-00-00 00:00:00"],
 ["9", "基礎 Ruby on Rails", "0000-00-00 00:00:00", "0000-00-00 00:00:00"],
 ["10",
  "オブジェクト指向設計実践ガイド - Rubyでわかる 進化し続ける柔軟なアプリケーションの育て方",
  "0000-00-00 00:00:00",
  "0000-00-00 00:00:00"]]
```

とてもわかりやすくなりました。
`pp`ライブラリって便利ですね。

# **おわりに**
Railsを構成しているファイルの大半は`.rb`ファイルで構成されています。
つまりは、rubyで書けるファイルが大半であるとも言えますね。
この事実を今一度思い出して、適切にアルゴリズムを組んで、より幅広く処理ができるように勉強していきたいと思います。

少しでも役に立ったという方は、いいね、お願いします(^^)

# **seeds.rbファイル関連**
[seeds.rbファイルに本番環境に即した大量データ挿入アルゴリズムを簡単に書いてみた[Rails]](https://qiita.com/takuyanin/items/5334908b22156ec7290f)