Как я вызываю RAILS_ENV в задаче граблей?

Не делайте Вас, просто хотите:

",".join(l)

, Очевидно, это становится более сложным, если необходимо заключить запятые в кавычки/выйти и т.д. в значениях. В этом случае я предложил бы смотреть на csv модуль в стандартной библиотеке:

https://docs.python.org/library/csv.html

45
задан Sam Saffron 7 July 2009 в 03:02
поделиться

3 ответа

Для этой конкретной задачи вам нужно только изменить соединение с БД, поэтому, как указал Адам, вы можете сделать это:

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, вы безопаснее всего создавать новый процесс сгребания:

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
50
ответ дан 26 November 2019 в 21:09
поделиться

Самым чистым и простым решением было бы переопределить RAILS_ENV (не ENV ['RAILS_ENV'] )

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

Во время процесса загрузки Приложение Rails RAILS_ENV инициализируется следующим образом

RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV)

Остальной код Rails напрямую использует RAILS_ENV .

Однако, как указал Майкл в комментарии к своему ответу, переключение RAILS_ENV на лету может быть рискованно. Другой подход - переключить соединение с базой данных, это решение фактически используется по умолчанию db: test tasks

ActiveRecord::Base.establish_connection(:test)
7
ответ дан 26 November 2019 в 21:09
поделиться

The best way of course is to specify the environment from the command line when you run the rake task, but if for some reason that's not what you want to do, you can do this:

ENV["RAILS_ENV"] = 'test'
RAILS_ENV.replace('test') if defined?(RAILS_ENV)

load "#{RAILS_ROOT}/config/environment.rb"

And that should do the trick.

4
ответ дан 26 November 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: