2010-09-09 4 views

Antwort

29

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

+0

Wird dies die Anfrage verlangsamen? Es wäre besser, es in ein Arbeiterrecht zu stecken? – Strawberry

+0

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. –

+0

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

-7

Haben Sie versucht `Rake ts: reindex`?

2

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 
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 

Und dann nur SomeModel.run_rake("ts:reindex") verwenden.

Verwandte Themen