5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-14

他の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: 東京都日野市程久保1丁目20−14,
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: 東京都日野市程久保1丁目20−14,
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.csvlib/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でも複数の画像の一斉インポートに成功しました!

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?