他のtextカラムは簡単に複数投入できるのですが、image(画像)カラムだけはいずれもnilになってしまい苦労したので、ここに複数の画像カラムを一斉に投入する2つの方法を記しておきます。
##環境
- Ruby 2.6.5
- Rails 6.0.3.2
##①複数の画像カラムをseedの初期データで投入する方法
db/migrate/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の記載を下記のように書き換える。
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.csv
とlib/tasks/import_csv.rake
で、同じように記載して、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分,#芝生
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
を、以下のように書き直す。
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カラムを以下のように変更する。
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でも複数の画像の一斉インポートに成功しました!