Выполнить задачу Rake из миграции?

У меня есть задача Rake, которая загружает данные конфигурации в БД из файла, есть ли правильный способ ruby/rails для ее вызова при миграции?

Моя цель – синхронизировать конфигурации БД моей команды, без необходимости широковещательной рассылки для запуска задачи lalala

  def self.up
    change_table :fis_situacao_fiscal do |t|
      t.remove :mostrar_endereco
      t.rename :serie, :modelo 
    end

    Faturamento::Cfop.destroy_all()
    #perform rake here !
  end

ОБНОВЛЕНИЕ Как я делаю сейчас и работает:

system('rake sistema:load_data file=faturamento/cfop')

И это предложение от @Ryan Bigg, и это исключение:

Rake::Task['rake sistema:load_data file=faturamento/cfop'].invoke()

.

==  AlterSituacaoFiscalModeloEndereco: migrating ====================
-- change_table(:fis_situacao_fiscal)
   -> 0.0014s

rake aborted!
An error has occurred, this and all later migrations canceled:

Don't know how to build task 'rake sistema:load_data file=faturamento/cfop'

Что пошло не так?


person Fabiano Soriani    schedule 13.04.2010    source источник
comment
Зачем тебе передавать слово «грабли»? Попробуйте без него. Он знает, что это задача грабли.   -  person ryeguy    schedule 14.04.2010
comment
@Fabiano: обновил ответ.   -  person Ryan Bigg    schedule 15.04.2010


Ответы (4)


Да, есть способ сделать это:

Rake::Task['your_task'].invoke

Обновить

Не заключайте в скобки rake, а просто название задачи. Вы должны установить переменную ENV при запуске:

В консоли

FILE=somefile.text rake db:sistema:load_data

Вызов отдельно

FILE=somefile.text rake some:other:task:that:calls:it

Это будет доступно в ваших задачах как ENV['file']

person Ryan Bigg    schedule 13.04.2010
comment
Я сделал обновление с вашим ответом, рад, если вы могли бы помочь еще немного - person Fabiano Soriani; 14.04.2010
comment
Что делать, если задача находится в пространстве имен? У меня есть исходная система, которую можно запустить с помощью rake semi:seed[89] (запустится файл .rb, начинающийся с 89_), но я не могу вызвать ее с помощью Rake::Task['semi:seed[89]']. У вас есть идея, как я могу вызвать исходную задачу в файле миграции? - person MrYoshiji; 15.05.2014
comment
Плохо, мне просто нужно было передать 89 аргументы в вызове: Rake::Task['semi:seed'].invoke('89') работает нормально - person MrYoshiji; 15.05.2014
comment
Кто-нибудь еще получил You have 1 pending migrations:. Это не позволит запустить другую задачу rake во время миграции. - person Joshua Pinter; 11.11.2014
comment
если вы не знаете названия своих задач, запустите rake -T -A, чтобы получить полный список - person ACLima; 26.04.2018

Обратите внимание, что если вы вызываете задачу Rake с помощью «системы», вам необходимо впоследствии проверить состояние процесса и вызвать исключение, если задача Rake не удалась. В противном случае миграция завершится успешно, даже если задача Rake завершится ошибкой.

Вы можете проверить статус процесса следующим образом:

if !($?.success?)
  raise "Rake task failed"
end

Вызов задачи rake — более приятный вариант — это приведет к сбою миграции, если задача Rake завершится неудачно.

person Leslie Viljoen    schedule 13.12.2011

Вы можете выполнить задачу rake из загруженной среды Rails с помощью Rake::Task['namespace:task'].invoke или Rake::Task['namespace:task'].execute.

Вы можете передавать данные задаче внутри метода invoke или execute. Пример:

Rake::Task['namespace:task'].invoke(paramValue)

Этот параметр может быть обработан в задаче rake следующим образом:

namespace :namespace do
  desc "Example description."
  task :task, [:param] => :environment do |t, args|
    puts args[:param]
    ...
  end
end

Это может быть выполнено на консоли как:

bundle exec rake namespace:task[paramValue]

Дополнительная информация: https://medium.com/@sampatbadhe/rake-task-invoke-or-execute-419cd689c3bd

person Jacob Dalton    schedule 07.01.2019

Это решение подходит лучше, ИМХО.

В вашем случае это будет что-то вроде этого:

backup_env = ENV.slice('file') if ENV.key?('file')
ENV['file'] = 'faturamento/cfop'
Rake::Task['sistema:load_data'].invoke
ENV.delete 'file'
ENV.merge!(backup_env) if backup_env
person Віталій Адамков    schedule 26.10.2018