読者です 読者をやめる 読者になる 読者になる

Railsで初期データを投入する

Ruby

前回のエントリで以下のようなことを書いた。

test/fixtures/以下にCSVを置いておけばUnitテストのテストデータとして勝手にDBにインポートしてくれるが、この仕組みを実環境の初期データ投入にも使いたい。どうすればいい?

fixturesメソッドの実装を見ても良かったが、とりあえず以下のようなものを作ってみた。

equire 'csv'
require "nkf"

class Importer
  def self.import(clazz)
    reader = CSV.open(RAILS_ROOT+"/db/migrate/data/" + clazz.table_name + ".csv", "r")
    keys = reader.shift
    until (row = reader.shift).blank?
      alist = keys.zip(row)
      hash = Hash[*alist.flatten]
      hash.each_pair do |key, value|
        puts value
        value = NKF.nkf("-w", value.to_s)
        puts value
        value = case clazz.columns_hash[key].type
        when :string 
          value.to_s
        when :integer
          value.to_i
        end
        hash[key] = value
      end
      model = clazz.new
      hash.each_pair do |key, value|
        model[key] = value
      end
      model.save!
    end 
  end
end 

あとは、Migrationスクリプト内部などで、

  require 'importer'
  Importer.import(Employee)

とかやると、/db/migrate/data/employees.csvが読み込まれて、DBの初期データとして投入される感じです。コードはやっつけですが、とりあえずこれでしのごう。