ruby-on-rails cron - ¿Las tareas de rake rieles proporcionan acceso a los modelos ActiveRecord?




whenever schedule (5)

Estoy tratando de crear una tarea de rastrillo personalizada, pero parece que no tengo acceso a mis modelos. Pensé que esto era algo implícitamente incluido en la tarea de rieles.

Tengo el siguiente código en lib / tasks / test.rake:

namespace :test do
  task :new_task do
    puts Parent.all.inspect
  end
end

Y aquí es cómo se ve mi modelo de padre:

class Parent < ActiveRecord::Base
  has_many :children
end

Es un ejemplo bastante simple, pero me sale el siguiente error:

/> rake test:new_task
(in /Users/arash/Documents/dev/soft_deletes)
rake aborted!
uninitialized constant Parent

(See full trace by running task with --trace)

¿Algunas ideas? Gracias


Answers

Cuando comience a escribir sus tareas de rake , use un generador para apagarlas por usted.

Por ejemplo:

rails g task my_tasks task_one task_two task_three 

Obtendrás un código auxiliar creado en lib / tasks llamado my_tasks.rake (obviamente, usa tu propio espacio de nombres) que se verá así:

namespace :my_tasks do

  desc "TODO"
  task :task_one => :environment do 
  end  

  desc "TODO"
  task :task_two => :environment do 
  end  

  desc "TODO"
  task :task_three => :environment do 
  end  

end

Todos los modelos de rieles, etc. estarán disponibles para el entorno actual desde cada bloque de tareas, a menos que esté utilizando el entorno de producción , en cuyo caso deberá requerir los modelos específicos que desea usar. Haz esto dentro del cuerpo de la tarea. (IIRC esto varía entre las diferentes versiones de Rails.)


La dependencia del entorno se llama correctamente, pero es posible que el rake aún no sepa sobre otras gemas de las que dependen sus modelos, en uno de mis casos, "protected_attributes".

La respuesta es correr:

bundle exec rake test:new_task

Esto garantiza que el entorno incluya las gemas especificadas en su Gemfile.


Con la nueva sintaxis de hash ruby ​​(Ruby 1.9), el entorno se agregará así a la tarea de rake:

namespace :test do
  task new_task: :environment do
    puts Parent.all.inspect
  end
end

Es posible que deba requerir su configuración (que debe especificar todos sus modelos requeridos, etc.)

p.ej:

require 'config/environment'

alternativamente, puede requerir cada uno por separado, pero es posible que tenga problemas de entorno no configurados, etc.)


Me gusta la sintaxis de "cadena de consulta" para el paso de argumentos, especialmente cuando hay muchos argumentos que deben pasarse.

Ejemplo:

rake "mytask[width=10&height=20]"

La "cadena de consulta" es:

width=10&height=20

Advertencia: tenga en cuenta que la sintaxis es rake "mytask[foo=bar]" y NO rake mytask["foo=bar"]

Cuando se analiza dentro de la tarea de rake utilizando Rack::Utils.parse_nested_query , obtenemos un Hash :

=> {"width"=>"10", "height"=>"20"}

(Lo bueno es que puedes pasar hashes y matrices, más abajo)

Así es como lograr esto:

require 'rack/utils'

task :mytask, :args_expr do |t,args|
  args.with_defaults(:args_expr => "width=10&height=10")
  options = Rack::Utils.parse_nested_query(args[:args_expr])
end

Aquí hay un ejemplo más extendido que estoy usando con Rails en mi gema delayed_job_active_record_threaded :

bundle exec rake "dj:start[ebooks[workers_number]=16&ebooks[worker_timeout]=60&albums[workers_number]=32&albums[worker_timeout]=120]"

Se analizó de la misma manera que anteriormente, con una dependencia del entorno (para cargar el entorno Rails)

namespace :dj do
  task :start, [ :args_expr ] => :environment do |t, args|
    # defaults here...
    options = Rack::Utils.parse_nested_query(args[:args_expr])  
  end
end

Da lo siguiente en options

=> {"ebooks"=>{"workers_number"=>"16", "worker_timeout"=>"60"}, "albums"=>{"workers_number"=>"32", "worker_timeout"=>"120"}}




ruby-on-rails activerecord rake task