Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 920
Fabiano Soriani Avatar asked Apr 13 '10 18:04

Fabiano Soriani


People also ask

How do I run a Rake file?

Go to Websites & Domains and click Ruby. After gems installation you can try to run a Rake task by clicking Run rake task. In the opened dialog, you can provide some parameters and click OK - this will be equivalent to running the rake utility with the specified parameters in the command line.


2 Answers

Yes there's a way to do that:

Rake::Task['your_task'].invoke 

Update

Do not put rake inside the brackets, just the name of the task. You should set an ENV variable when running this:

In the console

FILE=somefile.text rake db:sistema:load_data 

Calling it separately

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

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

like image 53
Ryan Bigg Avatar answered Oct 22 '22 09:10

Ryan Bigg


Note that if you call the Rake task with 'system', you need to check the process status afterwards and raise an exception if the Rake task failed. Otherwise the migration will succeed even if the Rake task fails.

You can check the process status like this:

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

Invoking the rake task is a nicer option - it will cause the migration to fail if the Rake task fails.

like image 30
Leslie Viljoen Avatar answered Oct 22 '22 11:10

Leslie Viljoen