Выполнять задачу 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
UPDATE
Как я это делаю сейчас, и работает:
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'
Где это пошло не так?
Ответы
Ответ 1
Да, есть способ сделать это:
Rake::Task['your_task'].invoke
Обновление
Не кладите грабли внутри скобок, просто имя задачи. Вы должны установить переменную ENV при ее запуске:
В консоли
FILE=somefile.text rake db:sistema:load_data
Вызов по отдельности
FILE=somefile.text rake some:other:task:that:calls:it
Это будет доступно в ваших задачах как ENV['file']
Ответ 2
Обратите внимание, что если вы вызываете задачу Rake с помощью "system", вам необходимо проверить статус процесса после этого и вызвать исключение, если задача Rake завершилась неудачно. В противном случае миграция будет успешной, даже если задача Rake завершится с ошибкой.
Вы можете проверить статус процесса следующим образом:
if !($?.success?)
raise "Rake task failed"
end
Вызов задачи рейка является более приятным вариантом - это приведет к сбою миграции, если задача Rake завершится с ошибкой.