从迁移中执行Rake任务?

时间:2010-04-13 18:30:42

标签: ruby-on-rails ruby migration

我有一个Rake任务,可以将配置数据从文件加载到DB中,是否有正确的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'

哪里出错了?

4 个答案:

答案 0 :(得分:79)

是的,有办法做到这一点:

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']

的形式提供

答案 1 :(得分:9)

请注意,如果使用“system”调用Rake任务,则需要在之后检查进程状态,并在Rake任务失败时引发异常。否则,即使Rake任务失败,迁移也会成功。

您可以像这样检查流程状态:

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

调用rake任务是一个更好的选择 - 如果Rake任务失败,它将导致迁移失败。

答案 2 :(得分:1)

您可以使用Rake::Task['namespace:task'].invokeRake::Task['namespace:task'].execute在加载的Rails环境中执行rake任务。

您可以在invokeexecute方法内部将数据传递到任务。示例:

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

答案 3 :(得分:0)

This decision更合适,恕我直言。

您的情况可能是这样的:

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