web-dev-qa-db-ja.com

移行内からRakeタスクを実行しますか?

ファイルからDBに構成データをロードするRakeタスクがあります。移行時にそれを呼び出すための正しいRuby/Railsの方法はありますか?

私の目的は、チームのDB構成を同期することですブロードキャストしてからタスクを実行する必要はありません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'

どこで問題が発生しましたか?

51
Fabiano Soriani

はい、それを行う方法があります:

Rake::Task['your_task'].invoke

更新

括弧の中にレーキを入れないでください。タスクのnameだけです。これを実行するときは、ENV変数を設定する必要があります。

コンソール内

FILE=somefile.text rake db:sistema:load_data

個別に呼び出す

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

これはENV['file']としてタスクで使用できます

82
Ryan Bigg

「システム」でRakeタスクを呼び出す場合は、後でプロセスのステータスを確認し、Rakeタスクが失敗した場合は例外を発生させる必要があることに注意してください。そうしないと、Rakeタスクが失敗しても、移行は成功します。

次のようにプロセスのステータスを確認できます。

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

Rakeタスクの呼び出しは、より優れたオプションです。Rakeタスクが失敗すると、移行が失敗します。

9
Leslie Viljoen

ロードされたRails環境のいずれかからRake::Task['namespace:task'].invokeまたはRake::Task['namespace:task'].execute

invokeまたはexecuteメソッド内のタスクにデータを渡すことができます。例:

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
Jacob Dalton

この決定 よりよく適合します、私見。

あなたの場合、それはこのようなsmthです:

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