Railsで初期データを投入する
前回のエントリで以下のようなことを書いた。
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の初期データとして投入される感じです。コードはやっつけですが、とりあえずこれでしのごう。