我如何运行我的Rails应用程序内rake任务

问题描述 投票:10回答:5

我想做的事:

在model.rb,在after_commit,我想运行rake任务TS:REINDEX

TS:重新索引通常与耙TS运行:索引

ruby-on-rails ruby rake thinking-sphinx
5个回答
30
投票

如果你希望这个耙代码请求阶段运行,那么你应该避免通过运行或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.rootRAILS_ROOT

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

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

http://railsblogger.blogspot.com/2009/03/in-queue_15.html获得最多的信息


3
投票

我有这个同样的问题,不能得到公认的答案在我与轨道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
投票
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")


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

-7
投票

你有没有试过`耙TS:reindex`?

© www.soinside.com 2019 - 2024. All rights reserved.