2010-09-09 9 views

Respuesta

29

Si desea ejecutar este código de rake durante el ciclo de solicitud, debe evitar ejecutar rake a través del system o cualquiera de la familia ejecutiva (incluidos los backticks) ya que esto iniciará un nuevo intérprete de ruby ​​y volverá a cargar el se llama.

su lugar se puede llamar a los comandos de rastrillo directamente de la siguiente manera: -

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 

Nota: en los carriles 4+, va a utilizar en lugar de Rails.rootRAILS_ROOT.

Y a continuación, sólo tiene que utilizar SomeModel.run_rake("ts:reindex")

Las partes claves aquí son a require rake y asegúrese de que se carga el archivo que contiene las definiciones de tareas.

mayoría de la información obtenida de http://railsblogger.blogspot.com/2009/03/in-queue_15.html

+0

¿Esto ralentizará la solicitud? Sería mejor ponerlo en un trabajador ¿verdad? – Strawberry

+0

Esto casi seguramente ralentizará la solicitud. No hago ningún comentario sobre si debe hacer esto o no, ya que no conozco su solicitud. Solo estaba ayudando con la pregunta en particular sobre "cómo" debería llamar rake desde dentro de Rails, no si hacerlo es una buena idea. –

+0

¿Esto funcionó para usted? Lo configuré, no recibo ningún error, pero no veo el resultado de la tarea en ningún lado, es decir, la tarea no parece ejecutarse. – kakubei

-7

¿Has probado `rake ts: reindex`?

2

tuve este mismo tema y no pude conseguir la respuesta aceptada para trabajar en mi controlador con un proyecto Rails 4 debido a un error de archivo de carga. This post me dio una solución de trabajo:

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 

Y a continuación, sólo tiene que utilizar SomeModel.run_rake("ts:reindex").

Cuestiones relacionadas