如何在Rails应用程序中运行rake任务

14

我想做的事情:

在 model.rb 中的 after_commit 中,我想要运行 rake 任务 ts:reindex。

通常需要使用 rake ts:index 来运行 ts:reindex。

5个回答

36

如果您希望此rake代码在请求周期内运行,则应避免通过system或任何exec家族(包括反引号)运行rake,因为每次调用都会启动一个新的Ruby解释器并重新加载rails环境。

相反,您可以直接调用Rake命令,如下所示:

require 'rake'

class SomeModel <ActiveRecord::Base

  def self.run_rake(task_name)
    load File.join(RAILS_ROOT, 'lib', 'tasks', 'custom_task.rake')
    Rake::Task[task_name].invoke
  end
end
注意:在Rails 4及以上版本中,您将使用Rails.root而不是RAILS_ROOT
然后只需使用SomeModel.run_rake("ts:reindex")
关键部分是要require rake并确保加载包含任务定义的文件。
大多数信息来自http://railsblogger.blogspot.com/2009/03/in-queue_15.html

这会减慢请求速度吗?最好将其放入工作进程中,不是吗? - Strawberry
这几乎肯定会减慢请求速度。我对他是否应该这样做没有评论,因为我不知道他的应用程序。我只是在回答关于如何从Rails中调用rake的特定问题,而不是是否这样做是个好主意。 - Steve Weet
这对你有效吗?我已经设置好了,没有出现任何错误,但我没有在任何地方看到任务的结果,也就是说似乎没有执行该任务。 - kakubei
1
实际上,我发现你需要使用.execute而不是.invoke才能让它工作,至少对我来说是这样。 - kakubei
请注意,在运行时环境中加载rake任务之前,您可能需要调用Rake::Task.clear,然后调用<YourAppModule>::Application.load_tasks - Anthony E
与其手动加载任务文件,你可以简单地执行 Rails.application.load_tasks - Stephen

4

这段代码可以自动加载你的Rails应用程序的Rake任务,而无需知道应用程序的名称 :)

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

3
require 'rake'
RailsApp::Application.load_tasks
class SomeModel <ActiveRecord::Base
  def self.run_rake(task_name)
    load File.join(Rails.root, 'lib', 'tasks', 'custom_task.rake')
    Rake::Task[task_name].invoke
  end
end

然后只需使用SomeModel.run_rake("ts:reindex")


3

我遇到了同样的问题,在使用Rails 4项目中,由于文件加载错误,无法在我的控制器中使用被接受的答案。这篇文章给了我一个有效的解决方案:

def restart_search
   require 'rake'
   spec = Gem::Specification.find_by_name 'thinking-sphinx'
   load "#{spec.gem_dir}/lib/thinking_sphinx/tasks.rb"
   Rake::Task["ts:stop"].execute
   Rake::Task["ts:start"].execute
   respond_to do |format|
     format.js { head :ok }
   end
end

-7
你尝试过执行 `rake ts:reindex` 命令吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接