読者です 読者をやめる 読者になる 読者になる

Rails4.0で rake db:fixtures:load FIXTURES_PATH=spec/fixtures が deprecated と表示された際の対処法

Ruby

Rails4.0RC2もリリースされましたね!
Rails4.0 で rake db:fixtures:load FIXTURES_PATH=spec/fixtures を実行すると以下のようなワーニングが表示されます。fixtuesの読み込みは出来てますが、気持ち悪いですよね。

% rake db:fixtures:load FIXTURES_PATH=spec/fixtures 
Using FIXTURES_PATH env variable is deprecated, 
please use ActiveRecord::Tasks::DatabaseTasks.fixtures_path = '/path/to/fixtures' instead.

色々と検索したのですが、適切な回答が見つからなかったので、ここに書いて置きます。

暫定的な対応

2013/12/19 Rails 4.0.2 では動作しないようです

fixturesのディレクトリーを指定する FIXTURES_PATHは deprecated ですが、fixtures ディレクトリーの下のディレクトリーを指定する FIXTURES_DIR は、まだ有効です。そこで、これを ../../ と悪用(?) して本来のfixturesのディレクトリー (デフォルトは test/fixures) の外のディレクトリーを指定しています。

% rake db:fixtures:load  FIXTURES_DIR=../../spec/fixtures

たぶん正しい対応


ワーニングに書かれているように、ActiveRecord::Tasks::DatabaseTasks.fixtures_path にfixturesのディレクトリーを指定すれば良いのですが、どこにこれを書いたら良いのかを見つけるのに手間取ってしまいました。

実は、 rake db:〜 の rakeタスクは lib/tasks に db.rake ファイルを書くことで機能を追加・変更できます。

namespace :db do
  task :load_config do
    ActiveRecord::Tasks::DatabaseTasks.fixtures_path = File.join(Rails.root, 'spec', 'fixtures') 
  end
end

2013/12/19 修正
2013/12/25 修正

そこで、 lib/tasks/db.rake ファイルに上のように書いてあげると、通常の rake db:fixtures:load で spec/fixtures から読み込んでくれます。