ruby-on-rails - 我如何在 rake 任务中强制使用 RAILS_ENV?

标签 ruby-on-rails ruby rake

我有这个小佣金任务:

namespace :db do 
  namespace :test do 
    task :reset do 
      ENV['RAILS_ENV'] = "test" 
      Rake::Task['db:drop'].invoke
      Rake::Task['db:create'].invoke
      Rake::Task['db:migrate'].invoke
    end
  end
end

现在,当我执行时,它将忽略我尝试硬编码的 RAILS_ENV。我如何使这个任务按预期工作

最佳答案

对于这个特定的任务,您只需要更改数据库连接,正如 Adam 指出的那样,您可以这样做:

namespace :db do 
  namespace :test do 
    task :reset do 
      ActiveRecord::Base.establish_connection('test')
      Rake::Task['db:drop'].invoke
      Rake::Task['db:create'].invoke
      Rake::Task['db:migrate'].invoke
      ActiveRecord::Base.establish_connection(ENV['RAILS_ENV'])  #Make sure you don't have side-effects!
    end
  end
end

如果您的任务更复杂,并且您需要 ENV 的其他方面,那么您最安全的做法是生成一个新的 rake 进程:

namespace :db do 
  namespace :test do 
    task :reset do 
      system("rake db:drop RAILS_ENV=test")
      system("rake db:create RAILS_ENV=test")
      system("rake db:migrate RAILS_ENV=test")
    end
  end
end

namespace :db do 
  namespace :test do 
    task :reset do 
      if (ENV['RAILS_ENV'] == "test")
        Rake::Task['db:drop'].invoke
        Rake::Task['db:create'].invoke
        Rake::Task['db:migrate'].invoke
      else
        system("rake db:test:reset RAILS_ENV=test")
      end
    end
  end
end

关于ruby-on-rails - 我如何在 rake 任务中强制使用 RAILS_ENV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1090176/

相关文章:

ruby-on-rails-3 - 如何让 rake 在没有参数的情况下自动运行任务?

ruby - 失败后继续 rake

mysql - 在 Rails 应用程序上进行全站搜索

SQL 更新帮助

ruby - 将多级数组转换为单级数组?

ruby-on-rails - Rails 3 处理具有固定可能性的属性的最佳实践

ruby-on-rails - 语法错误,意外 ',' ,在将类分配给 erb 时期望 tCOLON2 或 '[' 或 '.'

ruby-on-rails - 如何在 Rails 的目录结构中查找文件

ruby-on-rails - Sidekiq 工作卡在队列中

ruby-on-rails - 从 IDE 运行 rake 任务时出错