4

テストデータベースと開発データベースを次のような1つのrakeタスクから削除しようとしました。

task :regenerate do
  Rails.env = "test"
  Rake::Task["db:drop"].invoke
  Rails.env = "development"
  Rake::Task["db:drop"].invoke
end

テストデータベースは正常に削除されました。しかし、開発データベースは削除されませんでした。

これを機能させる方法について何かアイデアはありますか?

注意:これはRails3.2.3にあります

アップデート:

非常に奇妙ですが、順序を逆にすると機能します。

task :regenerate do
  Rails.env = "development"
  Rake::Task["db:drop"].invoke
  Rails.env = "test"
  Rake::Task["db:drop"].invoke
end

何が起こっている?!

4

3 に答える 3

5

あなたはそれをこのように書くことができます:

namespace :db do
  desc "Database custom drop"
  task :mydrop do
    system("rake db:drop RAILS_ENV=test")
    system("rake db:drop RAILS_ENV=development")
  end
end
于 2012-04-18T05:07:12.300 に答える
4

にいくつかの奇妙なコードがあるので、それを逆にすることは機能しますdatabase_tasks.rb

  def each_current_configuration(environment)
    environments = [environment]
    environments << 'test' if environment == 'development'

    configurations = ActiveRecord::Base.configurations.values_at(*environments)
    configurations.compact.each do |configuration|
      yield configuration unless configuration['database'].blank?
    end
  end

testenvが。の場合は常に追加されますdevelopmentdb:rebuildカスタムタスクを同時に実行developmentしたい場合を、最初と2番目testに実行することで解決しました。さらに、タスクを実行する前に、メソッドを呼び出します。これがないと、データベース接続が環境に対して期待どおりに個別に処理されないように見えます。私は他のすべての種類の切断などを試しましたが、これはそれ以上のコードなしで機能しました。developmenttestset_envActiveRecord::Tasks::DatabaseTasks.env

def set_env(env)
  Rails.env = env.to_s
  ENV['RAILS_ENV'] = env.to_s
  ActiveRecord::Tasks::DatabaseTasks.env = env.to_s
end

これは、マルチ環境とdb.rake同時マルチ環境を備えた私の完全なファイルの要点です。db:rebuilddb:truncate

于 2013-11-19T17:46:22.940 に答える
0

Ruby2とRails3.2.13を使用するシステムでは、rake db:dropを実行できます。

これにより、テストデータベースと開発データベースの両方が削除されます。レーキタスクをいじるよりもはるかに簡単になりました

于 2014-06-17T02:44:15.067 に答える