以下のような感じです。
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でテーブルを追加した時の初期データセットってどうするのが普通なのかしらん?
0 件のコメント:
コメントを投稿