Jak uruchomić zadania rake w mojej aplikacji rails

Co chcę zrobić:

W modelu.rb, w after_commit chcę uruchomić zadanie rake ts: reindex

Ts: reindex jest normalnie uruchamiany z rake ' em ts:index

Author: fivetwentysix, 2010-09-09

4 answers

Jeśli chcesz, aby ten kod rake był uruchamiany podczas cyklu żądania, powinieneś unikać uruchamiania rake ' a przez system lub którąkolwiek z rodziny exec (włączając backticki), ponieważ spowoduje to uruchomienie nowego interpretera ruby i przeładowanie środowiska rails za każdym razem, gdy zostanie wywołany.

Zamiast tego możesz wywoływać polecenia Rake bezpośrednio w następujący sposób:-

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

Uwaga: w Rails 4+ użyjesz Rails.root zamiast RAILS_ROOT.

A następnie po prostu użyj SomeModel.run_rake("ts:reindex")

Kluczowe części tutaj są require rake i upewnij się, że Załaduj plik zawierający definicje zadań.

Większość informacji uzyskanych z http://railsblogger.blogspot.com/2009/03/in-queue_15.html

 29
Author: Steve Weet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-31 17:05:12
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

A następnie po prostu użyj SomeModel.run_rake("ts:reindex").

 2
Author: Uday kumar das,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-05 07:49:27

Miałem ten sam problem i nie mogłem uzyskać zaakceptowanej odpowiedzi na pracę w moim kontrolerze z projektem Rails 4 z powodu błędu wczytania pliku. Ten post dał mi rozwiązanie robocze:

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
Author: littleforest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-29 22:58:02

Próbowałeś 'rake ts: reindex'?

 -7
Author: jordinl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-09 09:06:36