【Rails6】CarrierWaveを使い、複数の画像を一斉に投入する2つの方法/①seedの初期データで投入/②CSVでインポートする 

 他のtextカラムは簡単に複数投入できるのですが、image（画像）カラムだけはいずれもnilになってしまい苦労したので、ここに複数の画像カラムを一斉に投入する2つの方法を記しておきます。

##環境
* Ruby 2.6.5
* Rails 6.0.3.2 

##①複数の画像カラムをseedの初期データで投入する方法

`db/migrate/seed.rb`に、

```seed.rb

Post.create!(image: /public/uploads/post/image/1/yatoguti.jpg,
park: 谷戸口公園,
outline: 程久保の知る人ぞ知る,
location: 東京都日野市程久保１丁目２０−１４,
access: モノレール程久保駅から徒歩5分)
```

のように記載し、`rails db:reset`してから、`rails db:seed`するが、


```
=> [#<Post:0x00007fa6c66bc8e8
  id: 27,
  image: nil,
  park: "谷戸口公園",
  outline:
   "程久保の知る人ぞ知る。",
  location: "京王線高幡不動駅より百草園駅方面へ徒歩10分",
  access: "日野市高幡1024番地",
  created_at: Sun, 02 Aug 2020 14:38:30 JST +09:00,
  updated_at: Sun, 02 Aug 2020 14:38:30 JST +09:00,
  likes_count: nil,
  tag_list: ["#水遊び", "#アスレチック"]>,
 #<Post:0x00007fa6c7b48f28
  id: 28,
  image: nil,
  park: "雨乞公園",
  outline: "明るさと落ち着いた雰囲気の両面を持つ公園です。",
  location: "日野市百草881番地の8",
  access: "三沢台小学校バス停より東へ徒歩3分",
  created_at: Sun, 02 Aug 2020 14:38:30 JST +09:00,
  updated_at: Sun, 02 Aug 2020 14:38:30 JST +09:00,
  likes_count: nil,
:...skipping...
```

このように、**画像カラムは直接URLだけをを記載するとnil**になってしまう。


##解決方法

imageカラムの画像URLの記載を下記のように書き換える。


```seed.rb

Post.create!(image: File.open("#{Rails.root}/public/uploads/post/image/1/yatoguti.jpg"),
park: 谷戸口公園,
outline: 程久保の知る人ぞ知る,
location: 東京都日野市程久保１丁目２０−１４,
access: モノレール程久保駅から徒歩5分)

```

imageカラムの記載を、

```
Post.create!(image: /public/uploads/post/image/1/yatoguti.jpg,
```
ではなく、

```
Post.create!(image: File.open("#{Rails.root}/public/uploads/post/image/1/yatoguti.jpg"),
```
に変更する。そして、`rails db:reset`してから、`rails db:seed`する。

※`/image/1/yatoguti.jpg` には、実際に画像が入っているかどうか、予めファイルを確認しておいて下さい。

これで、seed初期データの一斉投入が出来ました！



##②複数の画像カラムをCSVでインポートする方法

seed.rbで初期データ投入では成功したので、今度は`db/csv_dara/csv_data.csv`と`lib/tasks/import_csv.rake`で、同じように記載して、CSVインポートでも試してみる。

```csv_data.csv
image,park,outline,location,access,tag_list
File.open("#{Rails.root}/public/uploads/post/image/6/ajisai.jpg"),芙蓉公園,日野市の「高幡不動」のすぐそばにあるこぢんまりとした公園です。団地の中の高台にあり、地域の子供達の憩いの場となっています。ブランコ、すべり台、鉄棒、砂場があり、自由に遊ぶことができるスペースも確保されています。,東京都日野市高幡714-21,高幡不動駅から徒歩5分,#滑り台 #鉄棒 #ブランコ #砂場
File.open("#{Rails.root}/public/uploads/post/image/8/hohoemi.jpg"),ほほえみ公園,コンクリートの小山が人気の公園です。小山の中には縦横に走るトンネル、外には留め金のついた登山ルート、そして幅広いすべり台と砂場とが一体化していて、ちょっとした冒険気分が楽しめます。,日野市南平2丁目31番地の6,北野街道口バス停より東へ5分,#滑り台 #鉄棒 #ブランコ
File.open("#{Rails.root}/public/uploads/post/image/7/hodokubo.jpg"),ほどくぼ地区広場,少し傾斜のある草原と雑木林。遊具はありませんが、木登り、草すべり、どんぐり拾いなどが楽しめます。原っぱなので、はだしでかけまわっても大丈夫。,日野市程久保3丁目22番地の2,京王線多摩動物公園駅より東へ徒歩5分,#芝生

```

```lib/tasks/import_csv.rake
require 'csv'

namespace :import_csv do

  desc "postテーブルのCSVデータをインポートするタスク"
  task posts: :environment do
    path = File.join Rails.root, "db/csv_data/csv_data.csv"
    list = []
    CSV.foreach(path, headers: true) do |row|
      list << {
          image: row ["image"],
          park: row["park"],
          outline: row["outline"],
          location: row["location"],
          access: row["access"],
          tag_list: row["tag_list"]
      }
    end
    puts "インポート処理を開始"
     Post.create!(list)
      puts "インポート完了!!"
  end

end


```


seedの初期投入ができた記載だから、CSVインポートも出来ると思っていました。すると…

```
rake aborted!
CSV::MalformedCSVError: Illegal quoting in line 2.
/Users/sekishinya/Desktop/park_app/lib/tasks/import_csv.rake:11:in `block (2 levels) in <main>'
Tasks: TOP => import_csv:posts
(See full trace by running task with --trace)
```

エラーでインポートできません。
元々imageカラム抜きでインポートしていたので、imageカラムが問題なのは間違いないはずですが。



##解決方法

CSVは、seedの時とは異なり、**全て文字列扱い**となるので記載が異なる。

そこで、`lib/tasks/import_csv.rake`と、`db/csv_dara/csv_data.csv`を、以下のように書き直す。

```import_csv.rake
require 'csv'

namespace :import_csv do

  desc "postテーブルのCSVデータをインポートするタスク"
  task posts: :environment do
    path = File.join Rails.root, "db/csv_data/csv_data.csv"
    list = []
    CSV.foreach(path, headers: true) do |row|
      list << {
          image: File.open("#{Rails.root}/#{row["image"]}"),
          park: row["park"],
          outline: row["outline"],
          location: row["location"],
          access: row["access"],
          tag_list: row["tag_list"]
      }
    end
    puts "インポート処理を開始"
     Post.create!(list)
      puts "インポート完了!!"
  end

end
```


`import_csv.rake`のimageカラムの記載を、

```
image: row ["image"],
```
ではなく、

```
image: File.open("#{Rails.root}/#{row["image"]}"),
```
に変更する。

そして、`csv_data.csv`のimageカラムを以下のように変更する。

```csv_data.csv
image,park,outline,location,access,tag_list
"public/uploads/post/image/8/fuyou.jpg",芙蓉公園,日野市の「高幡不動」のすぐそばにあるこぢんまりとした公園です。団地の中の高台にあり、地域の子供達の憩いの場となっています。ブランコ、すべり台、鉄棒、砂場があり、自由に遊ぶことができるスペースも確保されています。,東京都日野市高幡714-21,高幡不動駅から徒歩5分,#滑り台 #鉄棒 #ブランコ #砂場
"public/uploads/post/image/8/hohoemi.jpg",ほほえみ公園,コンクリートの小山が人気の公園です。小山の中には縦横に走るトンネル、外には留め金のついた登山ルート、そして幅広いすべり台と砂場とが一体化していて、ちょっとした冒険気分が楽しめます。,日野市南平2丁目31番地の6,北野街道口バス停より東へ5分,#滑り台 #鉄棒 #ブランコ
"public/uploads/post/image/8/hodokubo.jpg",ほどくぼ地区広場,少し傾斜のある草原と雑木林。遊具はありませんが、木登り、草すべり、どんぐり拾いなどが楽しめます。原っぱなので、はだしでかけまわっても大丈夫。,日野市程久保3丁目22番地の2,京王線多摩動物公園駅より東へ徒歩5分,#芝生

```
seedの時は、URLのみの記載で失敗しましたが、**逆にCSVデータはURLのみ**にした方が良いですね。

これで見事に、CSVでも複数の画像の一斉インポートに成功しました！