我想做什么:
在model.rb中,在after_commit中,我想运行rake task ts:reindex
ts:reindex通常使用rake ts:index
运行答案 0 :(得分:30)
如果您希望在请求周期中运行此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
,并确保加载包含任务定义的文件。
答案 1 :(得分:3)
由于加载文件错误,我遇到了同样的问题并且无法通过Rails 4项目获得在我的控制器中工作的接受答案。 This post给了我一个有效的解决方案:
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
答案 2 :(得分:2)
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 :(得分:0)
此代码自动为您的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
答案 4 :(得分:-7)
你试过`rake ts:reindex`?