我想做的事:
在model.rb,在after_commit,我想运行rake任务TS:REINDEX
TS:重新索引通常与耙TS运行:索引
如果你希望这个耙代码请求阶段运行,那么你应该避免通过运行或system
任何exec类(包括反引号)的佣金,因为这将启动一个新的Ruby解释器,并在每次调用时重新加载Rails环境。
相反,你可以直接调用耙命令如下: -
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获得最多的信息
我有这个同样的问题,不能得到公认的答案在我与轨道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
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")
。
此代码自动地加载你的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
你有没有试过`耙TS:reindex`?