■
[Rails]Rails 3.0系のrake db:fixtures:loadにFIXTURESで指定したテーブルがロードされないバグ
単複同形の名称を付けたモデルをFIXTURESで指定すると発生するようです。
以下は実行例です。(ユーザ名のところだけ修正してあります。)Seriesというモデルで確認します。
$ rails g model series name:string 1 source 'http://rubygems.org' invoke active_record create db/migrate/20110509181733_create_series.rb create app/models/series.rb invoke test_unit create test/unit/series_test.rb create test/fixtures/series.yml sugino-yasuhiro-no-MacBook-Air:teddy suginoyasuhiro$ rake db:migrate (in /Users/suginoyasuhiro/work/teddy) == CreateSeries: migrating =================================================== -- create_table(:series) -> 0.0019s == CreateSeries: migrated (0.0020s) ==========================================
テーブルとYAMLファイルができたので、ロードします。
$ rake db:fixtures:load FIXTURES=series (in /Users/...) rake aborted! Could not find /Users/.../work/sample/test/fixtures/se.yml or /Users/.../sample/teddy/test/fixtures/se.csv # <= ここに注目 /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/fixtures.rb:702:in `read_fixture_files' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/fixtures.rb:559:in `initialize' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/fixtures.rb:519:in `new' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/fixtures.rb:519:in `block (3 levels) in create_fixtures' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/fixtures.rb:518:in `map' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/ fixtures.rb:518:in `block (2 levels) in create_fixtures' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/connection_adapters/abstract_adapter.rb:109:in `disable_referential_integrity' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/fixtures.rb:515:in `block in create_fixtures' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activesupport-3.0.7/lib/active_support/benchmarkable.rb:55:in `silence' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/fixtures.rb:514:in `create_fixtures' /opt/local/lib/ruby1.9/gems/1.9.1/gems/ activerecord-3.0.7/lib/active_record/railties/databases.rake:294:in `block (4 levels) in <top (required)>' ...
seriesではなく、seというファイルを探そうとしていて落ちます。
対策として、以下のURLで報告されているパッチを当てると動きます。
報告は3.0.2で、パッチがどのバージョンに取り込まれたかの見方がよくわからないのですが、私が利用した3.0.4でも発生しました。せっかくなのでGemfileを変えて試したところ、3.0.5、3.0.6、3.0.7の3.0系全てで発生します。3.1.0.beta1では発生しませんでした。該当ソースである、lib/active_record/railties/databases.rakeでも確認しました。
rake db:fixtures:load FIXTURES=tables is broke
https://rails.lighthouseapp.com/projects/8994/tickets/6061-rake-dbfixturesload-fixturestables-is-broken
パッチ適用前(実際は2行ですが、改行しています。)
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) .map {|f| File.join(fixtures_dir, f) } : Dir["#{fixtures_dir}/**/*.{yml,csv}"]).each do |fixture_file| Fixtures.create_fixtures(fixtures_dir, fixture_file[(fixtures_dir.size + 1)..-5])
パッチ適用後
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir["#{fixtures_dir}/**/*.{yml,csv}"] .map {|f| f[(fixtures_dir.size + 1)..-5] }).each do |fixture_file| Fixtures.create_fixtures(fixtures_dir, fixture_file)
Ruby使用歴が浅い私にはパッチの前後で動作が変わらないように見えてしまうのですが?誰か解説をお願いします。^^;