Search code examples
ruby-on-railsrubymigration

Execute a Rake task from within migration?


I have a Rake task that loads configuration data into the DB from a file, is there a correct ruby/rails way to call it on a migration up?

My objective is to sync my team DB configs, without have to broadcast then to run the task 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 How I do now, and works:

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

And this is the suggestion from @Ryan Bigg, and it's exception:

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'

Where it went wrong?


Solution

  • Yes! There is a way to do that.

    Run the following command.

    Rake::Task['your_task'].invoke
    

    Updated solution

    Do not put Rake inside parenthesis, just the name of the task. I recommend that you set an ENV variable when running the following in the console.

    FILE=somefile.text rake db:sistema:load_data
    

    You can call it separately using the following example.

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

    It will be available in your tasks as ENV['file'].