如何使用 sidekiq 运行 rake db:migrate

How to run rake db:migrate with sidekiq

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

这个有效

class ScaffoldGeneratorWorker
  include Sidekiq::Worker

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

但之后我无法将其发送到 运行 并工作

class DatabaseMigrationWorker
  include Sidekiq::Worker

  def perform
    `rake db:migrate`
  end
end

这可能吗?如果可以,我怎样才能让它工作。非常感谢任何帮助。

您尝试过在文件顶部添加 require 'rake' 吗?

How do I run rake tasks within my rails application

可能重复

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

class DatabaseMigrationWorker
  include Sidekiq::Worker

  def perform
     Name_Of_Your_App::Application.load_tasks
     Rake::Task['db:migrate'].invoke
  end
end

此代码会自动为您的 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

如果需要带参数调用Rake任务,直接通过invoke方法传入即可(https://www.rubydoc.info/gems/rake/Rake%2FTask:invoke):

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