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

我想做的事:

在model.rb中,在after_commit中,我想运行rake task ts:reindex

ts:reindex通常使用rake ts:index运行

如果你希望这个rake代码在请求周期中运行,那么你应该避免通过system或任何exec系列(包括反引号)运行rake,因为这将启动一个新的ruby解释器并在每次调用时重新加载rails环境。

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

 require 'rake' class SomeModel  

注意:在Rails 4+中,您将使用Rails.root而不是RAILS_ROOT

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

这里的关键部分是require rake并确保加载包含任务定义的文件。

大多数信息来自http://railsblogger.blogspot.com/2009/03/in-queue_15.html

由于加载文件错误,我遇到了同样的问题并且无法通过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 
 require 'rake' RailsApp::Application.load_tasks class SomeModel  

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

你试过`rake ts:reindex`吗?