Ruby
CSV
RubyOnRails

[Rails] csvファイルからReference型を含むオブジェクト(seeds.rb)を作る

CSVから初期データを作る

前提条件

  • 目的のCSVは、db/csv/foodlist.csvとする
  • Foodモデルのオブジェクトを作成し、csvの1列目をname、2列目の数値に"円"を付け加えてpriceとする。

seeds.rbに以下のコードを追記することで、csvからオブジェクトを作成できる。

seeds.rb
require "csv"

CSV.foreach('db/csv/foodlist.csv', encoding: 'Shift_JIS:UTF-8') do |row|
  Food.create(name: row[0], price: "#{row[1]} 円")
end

注意

  • CSVのパスは相対パス
  • UTF-8で開かないとエラーが出るので、Encodeした方が良い
  • rowの部分はお好きな変数名で
  • csvの1列目はrow[1]ではなくrow[0]なので注意

Reference型を含むデータを作る

前提条件

  • Orderモデルオブジェクトを作成し、csvの1列目がFoodの名前、2列目がnumとする。
  • ただし、Orderオブジェクトに入れるのはFoodの名前ではなく、その名前を持つFoodオブジェクト(Reference型)とする。
  • 読み込むcsvはdb/csv/orderlist.csv
seeds.rb
require "csv"

CSV.foreach('db/csv/foodlist.csv', encoding: 'Shift_JIS:UTF-8') do |row|
  Food.create(name: row[0], price: "#{row[1]} 円")
end

CSV.foreach('db/csv/orderlist.csv', encoding: 'Shift_JIS:UTF-8') do |row|
  food = Food.find_by(name: row[0])
  Order.create(food: food, num: row[1])
end

foreachの中で1列目(row[0])の名前でhitするFoodを見つけて、Order.create時にそのオブジェクトを渡してあげれば問題なくデータを作成できる