0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-17

はじめに

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">,

しっかり入ってますね!

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

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

参考にした記事

0
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
0
0