如何使用sidekiq运行rake db:migrate

Roc*_*ice 1 ruby-on-rails sidekiq

我正在尝试运行命令rake db:migrate使用sidekiq worker但似乎它不会工作,我很好奇是否有办法这样做或不.我正在使用sidekiq创建一个脚手架,但之后无法迁移它

这有效

class ScaffoldGeneratorWorker
  include Sidekiq::Worker

    def perform(id)
      `rails g scaffold test_#{id} title:string body:text slug:string visible:boolean`
    end
end
Run Code Online (Sandbox Code Playgroud)

但我不能让它在事后运行

class DatabaseMigrationWorker
  include Sidekiq::Worker

  def perform
    `rake db:migrate`
  end
end
Run Code Online (Sandbox Code Playgroud)

这是可能的,如果是这样,我怎样才能让它发挥作用.任何帮助是极大的赞赏.

Зел*_*ный 8

首先你应该加载rake任务,然后调用:

class DatabaseMigrationWorker
  include Sidekiq::Worker

  def perform
     Name_Of_Your_App::Application.load_tasks
     Rake::Task['db:migrate'].invoke
  end
end
Run Code Online (Sandbox Code Playgroud)


snr*_*rlx 5

这段代码会自动为您的 Rails 应用程序加载 Rake 任务,而您甚至不知道您的应用程序是如何命名的(我就是这种情况)。它还使代码更容易在各种 Rails 项目之间共享。

class MySidekiqTask
  include Sidekiq::Worker

  def perform
    application_name = Rails.application.class.parent_name
    application = Object.const_get(application_name)
    application::Application.load_tasks
    Rake::Task['db:migrate'].invoke
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您需要使用参数调用 Rake 任务,您可以简单地通过invoke方法(https://www.rubydoc.info/gems/rake/Rake%2FTask:invoke)传递它们:

Rake::Task['db:migrate'].invoke(params)