How do I force RAILS_ENV in a rake task?

后端 未结 6 893
暗喜
暗喜 2020-11-28 06:00

I have this little rake task:

namespace :db do 
  namespace :test do 
    task :reset do 
      ENV[\'RAILS_ENV\'] = \"test\" 
      Rake::Task[\'db:drop\']         


        
6条回答
  •  暖寄归人
    2020-11-28 06:55

    For this particular task, you only need to change the DB connection, so as Adam pointed out, you can do this:

    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
    

    If your task is more complicated, and you need other aspects of ENV, you are safest spawning a new rake process:

    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
    

    or

    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
    

提交回复
热议问题