从迁移中执行Rake任务?

Fab*_*ani 50 ruby migration ruby-on-rails

我有一个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
Run Code Online (Sandbox Code Playgroud)

更新 我现在的工作方式,并且有效:

system('rake sistema:load_data file=faturamento/cfop')
Run Code Online (Sandbox Code Playgroud)

这是@Ryan Bigg的建议,它是例外:

Rake::Task['rake sistema:load_data file=faturamento/cfop'].invoke()
Run Code Online (Sandbox Code Playgroud)

.

==  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'
Run Code Online (Sandbox Code Playgroud)

哪里出错了?

Rya*_*igg 83

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

Rake::Task['your_task'].invoke
Run Code Online (Sandbox Code Playgroud)

更新

不要将耙子放在括号内,只是任务的名称.你应该在运行时设置一个ENV变量:

在控制台中

FILE=somefile.text rake db:sistema:load_data
Run Code Online (Sandbox Code Playgroud)

单独调用它

FILE=somefile.text rake some:other:task:that:calls:it
Run Code Online (Sandbox Code Playgroud)

这将在您的任务中可用 ENV['file']

  • 如果任务在命名空间中怎么办?我有一个种子系统,可以用`rake semi:seed [89]`运行(将运行以`89_`开头的.rb文件),但是我不能用`Rake :: Task ['半调用它来调用它: seed [89]']`您对如何在迁移文件中调用种子任务有所了解吗? (3认同)
  • 我的坏,我只需要在调用中传递`89` args:`Rake :: Task ['semi:seed'].invoke('89')`工作正常 (3认同)

Les*_*oen 9

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

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

if !($?.success?)
  raise "Rake task failed"
end
Run Code Online (Sandbox Code Playgroud)

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


Jac*_*ton 5

您可以使用Rake::Task['namespace:task'].invoke或 来从加载的 Rails 环境中执行 rake 任务Rake::Task['namespace:task'].execute

您可以将数据传递给invokeorexecute方法内部的任务。例子:

Rake::Task['namespace:task'].invoke(paramValue)
Run Code Online (Sandbox Code Playgroud)

这个参数可以在 rake 任务中处理如下:

namespace :namespace do
  desc "Example description."
  task :task, [:param] => :environment do |t, args|
    puts args[:param]
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

这可以在控制台上执行为:

bundle exec rake namespace:task[paramValue]
Run Code Online (Sandbox Code Playgroud)

更多信息:https : //medium.com/@sampatbadhe/rake-task-invoke-or-execute-419cd689c3bd