rakeタスクを使い複数の画像を一斉に投入する方法

## はじめに
`Carrierwave`を使用し`active_admin(管理者画面)`から
一枚一枚画像の投稿をしていました。
データベースのデータを一度削除する必要があり
そこで、　

け：「また一枚一枚投稿するのか〜だるいな、なんかいい方法ないかな」

から始まりました。笑

## 内容
今回変更したファイルは以下になります

`lib/tasks/import_csv.rake`
`db/csv_data/text_data.csv`

なかなめんどくさい作業でした。笑

では、行きましょう

## 解決策

元はこちらでした

```:lib/tasks/import_csv.rake
desc "TEXTデータをインポートするタスク"
    task movie_data: :environment do
        list = Import.csv_data(path: "db/csv_data/text_data.csv")
        Text.create!(list)
    end
```

このままだと画像のアップは出来ません。
そこで`open`メソッドを使用し画像ファイルを開けるように指示を出します。

```:lib/tasks/import_csv.rake
desc "TEXTデータをインポートするタスク"
    task text: :environment do
        list = Import.csv_data(path: "db/csv_data/text_data.csv")
               *　File.joinで Rails.root+"db/csv_data/text_data.csv"を結合します。
        path = File.join Rails.root, "db/csv_data/text_data.csv"
        CSV.foreach(path, headers: true) do |row|
            list << {         
                image: File.open("#{Rails.root}/#{row['image']}")
            }
          end
          puts "インポート処理を開始"
        Text.create!(list)
          puts "インポートに成功しました"
    end
```

` CSV.foreach`を使用することで1行ずつ処理をするため、行数が多いCSVファイルを扱う場合でもメモリ使用量を気にしないで使える。

この記述が終えれば次はCSVファイルの編集ですね！

```:db/csv_data/text_data.csv
image,genre,title,content
"db/fixtures/スライド2.jpeg",Basic,Macのショートカットキー,"パソコンになれてないなら、まずはショートカットキーから使えるようにしていきましょう。ここにあげてあるショートカットキーを使えないと、プログラミングの学習効率は全く上がらないです。
```
`db/fixtures/スライド2.jpeg`とファイルのpathを記述してあげる。
僕の場合まだまだデータがあるので、
ファイルのpathを同じように与えていく、、、

**これが地味に大変でした**ww



記述が終われば次にタスクをインポートしましょう！

```:ターミナル

rake -T 
.
.
.
.
rake import_csv:text                    # TEXTデータをインポートするタスク
```

コマンドを確認
`rake import_csv:text`をコピペして実行

```:ターミナル
rake import_csv:text
.
.
.
.
インポート処理を開始
rake aborted!
ActiveRecord::RecordInvalid: バリデーションに失敗しました: Titleは空欄にできません, Genreは空欄にできません, Contentは空欄にできません
```
少し違和感のあるコードだと思ったがやっぱりかという感じですね　笑

エラー文を読むとどうやら他のカラムにデータが入っていないと、、

もう一度コードを見てみましょ。


```:lib/tasks/import_csv.rake
desc "TEXTデータをインポートするタスク"
    task text: :environment do
        list = Import.csv_data(path: "db/csv_data/text_data.csv")
               *　File.joinで Rails.root+"db/csv_data/text_data.csv"を結合します。
        path = File.join Rails.root, "db/csv_data/text_data.csv"
        CSV.foreach(path, headers: true) do |row|
            list << {         
                image: File.open("#{Rails.root}/#{row['image']}")
　　　　　　　!!??　*listにimageしか入れていなかったですね　笑
            }
          end
          puts "インポート処理を開始"
        Text.create!(list)
          puts "インポートに成功しました"
    end
```

以下追加

```:lib/tasks/import_csv.rake
desc "TEXTデータをインポートするタスク"
    task text: :environment do
        list = Import.csv_data(path: "db/csv_data/text_data.csv")
        path = File.join Rails.root, "db/csv_data/text_data.csv"
        CSV.foreach(path, headers: true) do |row|
            list << {
                image: File.open("#{Rails.root}/#{row['image']}"),
               #　以下追加　
                genre: row["genre"],
                title: row["title"],
                content: row["content"]
            }
          end
          puts "インポート処理を開始"
        Text.create!(list)
          puts "インポートに成功しました"
    end
```

再度インポート実行
`rake import_csv:text`

```
インポート処理を開始
インポートに成功しました
```

成功しましたね！
念のため中身があるか確認します。

```:コンソール
pry(main)> Text.select("image")
.
.
.
.
#<Text:0x00007fb4e4c29f98 id: nil, image: "スライド2.jpeg">,
```

しっかり入ってますね！


ざっくりとした内容になりましたが以上になります。

記事にして書くと情報が定着できるのでいいですね　笑


## 参考にした記事
https://remonote.jp/rails-carrierwave-seed