Lo que quiero hacer:¿Cómo ejecuto tareas rastrillo dentro de mi aplicación rieles
En un model.rb, en after_commit, quiero correr ts tarea rake: reindex
ts: reindex es normalmente ejecutar con un rastrillo ts: índice
Lo que quiero hacer:¿Cómo ejecuto tareas rastrillo dentro de mi aplicación rieles
En un model.rb, en after_commit, quiero correr ts tarea rake: reindex
ts: reindex es normalmente ejecutar con un rastrillo ts: índice
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.root
RAILS_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
¿Has probado `rake ts: reindex`?
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
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")
.
¿Esto ralentizará la solicitud? Sería mejor ponerlo en un trabajador ¿verdad? – Strawberry
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. –
¿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