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

时间:2010-09-09 09:01:56

标签: ruby-on-rails ruby rake thinking-sphinx

我想做什么:

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

ts:reindex通常使用rake ts:index

运行

5 个答案:

答案 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,并确保加载包含任务定义的文件。

http://railsblogger.blogspot.com/2009/03/in-queue_15.html

获取的大部分信息

答案 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`?