2013-05-09

railsでDATAと__END__みたいなやつ使ってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyでは一つのファイルにプログラムとデータを一緒に記述できます。

以下のような感じです。

DATA.each_line do |l|
  puts l
end

__END__
aaa
bbb
ccc

__END__以下がデータを記述したファイル扱いになって、DATAで取り出せます。

これをrailsのmigrationでテーブルをcreateしたの時の初期データセットに利用してみようと思ったわけです。

こんな感じです。

class CreateHoges < ActiveRecord::Migration
  def self.up
    create_table :hoges do |t|
      t.column :c1 ,:string
      t.column :c2 ,:string
      t.column :c3 ,:integer
    end
    DATA.each_line do |line|
      d = line.split(",")
      h = Hoge.new
      h.c1 = d[0]
      h.c2 = d[1]
      h.c3 = d[2]
      h.save!
    end
   end

  def self.down
    drop_table :hoges
  end
end

__END__
aaa,bbbb,111
ccc,dddd,222


でも、これを実行しようとしたらDATAなど知らないよ!とエラーが出てしまいました。

明確な理由は、よくわからなかったのですがDATAと__END__を利用するのは一つのファイルで完結するようなものに限ったほうがよさそうです。
以下が参考になりました。
http://d.hatena.ne.jp/yarb/20120927/p1

そして調べていたら、以下のような感じにすればOKでした。

class CreateHoges < ActiveRecord::Migration
  def self.up
    create_table :hoges do |t|
      t.column :c1 ,:string
      t.column :c2 ,:string
      t.column :c3 ,:integer
    end
    data = File.read(__FILE__).split('__END__').last
    data.each_line do |line|
      line.chomp!
      next if line.size == 0
      d = line.split(",")
      h = Hoge.new
      h.c1 = d[0]
      h.c2 = d[1]
      h.c3 = d[2]
      h.save!
    end
   end

  def self.down
    drop_table :hoges
  end
end

__END__
aaa,bbbb,111
ccc,dddd,222


以下が参考になりました。
http://matthewtodd.org/2008/04/22/rails-tip-2-faking-data-in-tests.html

そもそもrailsでテーブルを追加した時の初期データセットってどうするのが普通なのかしらん?


コメントを投稿