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

これでテストを書くためにデータをメチャメチャにしても
やり直せる。^^;