如何在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`吗?