ギャル曽根の高校時代
オレンジニュースに載っていたんですけど、
http://blog.livedoor.jp/ressbook2ch/archives/50533930.html
これです。確かにかわいいかもしれない。
Test用のfixtureを今使っているデータから落とす
さすが、舞波。現在のデータベースからyamlにデータを落とす方法を知っている。
http://wota.jp/ac/?date=20060211#p01
しかし、舞波氏が書いている
desc "Save fixtures from the current environment's database" task :save_fixtures => :environment do Dir["app/models/*.rb"].each{|i| eval File.basename(i, '.rb').camelize} Object.subclasses_of(ActiveRecord::Base).each{|klass| klass.to_fixture} end
がうまく動かない。と、なんでかと思ったらCGI::Session::ActiveRecordStore::Sessionが
AcitiveRecord::Baseを継承していることがわかり、
desc "Save fixtures from the current environment's database" task :save_fixtures => :environment do Dir["app/models/*.rb"].each{|i| eval File.basename(i, '.rb').camelize} Object.subclasses_of(ActiveRecord::Base).each{|klass| klass.to_fixture unless klass==CGI::Session::ActiveRecordStore::Session} end
とRakefileに書いて、
rake save_fixtures
でうまくいきました。
Test用のfixtureを今のdbに戻す
ar_fixturesにあるload_from_fileがなんだかうまく動きません。
ruby ./script/runner "User.load_from_file('test/fixtures/users.yml')"
で動くはずなのですが、エラーが出ます。
なので、大幅に書き換えてしまいました。やっつけですけど。
そのパッチ。
--- ar_fixtures.rb (リビジョン 707) +++ ar_fixtures.rb (リビジョン 720) @@ -24,17 +24,24 @@ end records = YAML::load( File.open( File.expand_path(path, RAILS_ROOT) ) ) - records.each do |record| - record_copy = self.new(record.attributes) - record_copy.id = record.id + records.each do |key,record| +=begin + record_copy = self.new(record) + record_copy["id"] = record["id"] # For Single Table Inheritance - klass_col = record.class.inheritance_column.to_sym - if record[klass_col] - record_copy.type = record[klass_col] + begin + klass_col = record.class.inheritance_column.to_sym + if record[klass_col] + record_copy.type = record[klass_col] + end + rescue end - record_copy.save + record_copy.save! +=end + rc=self.new(record) + rc.save end if connection.respond_to?(:reset_pk_sequence!)
これでうまく行きました。
$ ./script/runner "User.load_from_file('test/fixtur es/users.yml')"
を実行すると見事にデータが戻されているはず。
modelの数だけ戻したいのです
desc "Load from fixtures to the current environment's database" task :load_fixtures => :environment do Dir["app/models/*.rb"].each{|i| eval File.basename(i, '.rb').camelize} Object.subclasses_of(ActiveRecord::Base).each{|klass| klass.load_from_file("test/fixtures/#{klass.to_s.tableize}.yml") unless klass==CGI::Session::ActiveRecordStore::Session} end
上をRakefileに追加します。
rake load_fixtures
あれあれっと言う間に全部データが入ります。
やる前に私はdbを作りなおしておきます。
dropdb myproject_development createdb -E unicode myproject_development rake migrate rake load_fixtures
これでテストを書くためにデータをメチャメチャにしても
やり直せる。^^;