はじめに
Carrierwave
を使用しactive_admin(管理者画面)
から
一枚一枚画像の投稿をしていました。
データベースのデータを一度削除する必要があり
そこで、
け:「また一枚一枚投稿するのか〜だるいな、なんかいい方法ないかな」
から始まりました。笑
内容
今回変更したファイルは以下になります
lib/tasks/import_csv.rake
db/csv_data/text_data.csv
なかなめんどくさい作業でした。笑
では、行きましょう
解決策
元はこちらでした
desc "TEXTデータをインポートするタスク"
task movie_data: :environment do
list = Import.csv_data(path: "db/csv_data/text_data.csv")
Text.create!(list)
end
このままだと画像のアップは出来ません。
そこでopen
メソッドを使用し画像ファイルを開けるように指示を出します。
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ファイルの編集ですね!
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は空欄にできません
少し違和感のあるコードだと思ったがやっぱりかという感じですね 笑
エラー文を読むとどうやら他のカラムにデータが入っていないと、、
もう一度コードを見てみましょ。
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
以下追加
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">,
しっかり入ってますね!
ざっくりとした内容になりましたが以上になります。
記事にして書くと情報が定着できるのでいいですね 笑
参考にした記事