Как запустить rake-задачи в моем приложении rails

Что я хочу сделать:

В model.rb, after_commit, я хочу запустить rake task ts: reindex

ts: reindex обычно запускается с помощью rake ts: index

Ответ 1

Если вы хотите, чтобы этот код рейка выполнялся во время цикла запроса, вам следует избегать использования rake через system или любое из семейства exec (включая обратные выходы), так как это запустит новый интерпретатор ruby ​​и перезагрузит среду рельсов каждый раз он называется.

Вместо этого вы можете напрямую вызвать команды 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

Ответ 2

У меня была эта же проблема и я не смог получить принятый ответ для работы в моем контроллере с проектом 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

Ответ 3

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").

Ответ 4

Вы пробовали `rake ts: reindex`?