Was ich tun möchte:Wie führe ich Rake Aufgaben in meiner Rails-Anwendung
In einem model.rb, in after_commit, ich will Rake Aufgabe ts auszuführen: reindex
ts: reindex ist in der Regel mit einem Rechen laufen ts: index
Was ich tun möchte:Wie führe ich Rake Aufgaben in meiner Rails-Anwendung
In einem model.rb, in after_commit, ich will Rake Aufgabe ts auszuführen: reindex
ts: reindex ist in der Regel mit einem Rechen laufen ts: index
Wenn Sie möchten, dass dieser Rake-Code während des Anfragezyklus ausgeführt wird, sollten Sie Rake über system
oder eine der Exec-Familie (einschließlich Backticks) vermeiden, da dies einen neuen Ruby-Interpreter startet und die Rails-Umgebung jedes Mal neu lädt wird genannt.
Stattdessen können Sie die Rake rufen direkt Befehle wie folgt: -
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
Hinweis: in Rails 4+, werden Sie Rails.root
statt RAILS_ROOT
verwenden.
Und dann benutzen Sie einfach SomeModel.run_rake("ts:reindex")
Die wichtigsten Teile sind hier zu require rake
und stellen Sie sicher, dass Sie die Datei mit den Aufgabendefinitionen enthält laden.
Die meisten Informationen erhalten von http://railsblogger.blogspot.com/2009/03/in-queue_15.html
Haben Sie versucht `Rake ts: reindex`?
ich das gleichen Problem hatte und nicht die akzeptierte Antwort in meinem Controller mit einem Rails-4-Projekt zu einem Last Dateifehlern wegen der Arbeit bekommen konnte. This post gab mir eine Arbeitslösung:
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
Und dann nur SomeModel.run_rake("ts:reindex")
verwenden.
Wird dies die Anfrage verlangsamen? Es wäre besser, es in ein Arbeiterrecht zu stecken? – Strawberry
Dies wird fast sicher verlangsamen die Anfrage. Ich sage nicht, ob er das tun soll oder nicht, da ich seine Bewerbung nicht kenne. Ich half nur bei der speziellen Frage, "Wie" er Rake aus Rails anrufen sollte, nicht ob es eine gute Idee ist. –
Hat dies für Sie funktioniert? Ich habe es eingerichtet, bekomme keine Fehler, aber ich sehe das Ergebnis der Aufgabe nirgends, dh die Aufgabe scheint nicht ausgeführt zu werden. – kakubei