Что я хочу сделать:
В model.rb, after_commit, я хочу запустить rake task ts: reindex
ts: reindex обычно запускается с помощью rake ts: index
Что я хочу сделать:
В model.rb, after_commit, я хочу запустить rake task ts: reindex
ts: reindex обычно запускается с помощью rake ts: index
Если вы хотите, чтобы этот код рейка выполнялся во время цикла запроса, вам следует избегать использования 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
У меня была эта же проблема и я не смог получить принятый ответ для работы в моем контроллере с проектом 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
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")
.
Вы пробовали `rake ts: reindex`?