LoginSignup
1
1

More than 5 years have passed since last update.

seeds.rbでCSVのレコードをhash化してからcreateする

Posted at

seeds.rbでCSV入力するサンプルで、
以下の記述をよく見る。

seeds.rb
CSV.foreach('db/initFoods.csv') do |food|
  Food.create(
  :name     => food[0],
  :calories => food[1],
  :protein  => food[2],
  :totalFat => food[3])
end

これだと、後からFoodの途中に属性を追加するのが辛い。

例えば、頭にcategoryを追加するには、
以下のようにいちいちインデックスの書き換えが必要になる。

seeds.rb
CSV.foreach('db/initFoods.csv') do |food|
  Food.create(
  :category => food[0],
  :name     => food[1],
  :calories => food[2],
  :protein  => food[3],
  :totalFat => food[4])
end

モデル側にCSVから取得したい属性を返すメソッドを追加して、
1レコードごとにhash化してからcreateした方が、
良さげ。

food.rb
class Food < ActiveRecord::Base
  ATTRIBUTES = [
    "category",
    "name",
    "calories",
    "protein",
    "totalFat"
  ]

  def self.getAttributes()
    return ATTRIBUTES;
  end
seeds.rb
attributes = Food.getAttributes()
CSV.foreach('db/initFoods.csv') do |food|
  hash = {}
  for i in 0..attributes.length-1 do
    hash.store(attributes[i], food[i])
  end

  Food.create(hash)
end

属性が多い場合、for文で回せるのも楽。

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