¿Las tareas de rastrillo de rieles proporcionan acceso a los modelos ActiveRecord?

235

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 con la tarea de rieles.

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

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

Y así es como se ve mi modelo principal:

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

gmoniey
fuente

Respuestas:

410

Entendido, la tarea debería verse así:

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

Observe la => :environmentdependencia agregada a la tarea

gmoniey
fuente
44
¿Qué significa esta sintaxis? se está asignando new_taskal entorno actual? ¿Cuál es el valor actual de :environment? Google no está ayudando.
Scott Coates
12
@scoarescoare: el entorno aquí es la dependencia, así que cuando se ejecute new_task, cargue el entorno (cargue sus modelos) primero y luego ejecute new_task.
bigpotato
3
@scoarescoare puedes consultar el documento de rake personalizado , el primer ejemplo te lo dirá
lazybios
¿Cómo lograr lo mismo en Sinatra?
AMBasra
el nombre del modelo tiene que seguir con todos y no funciona sin él como TodoList.all.each no TodoList.each idk ¿por qué parece funcionar?
Kick Buttowski el
17

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

p.ej:

require 'config/environment'

alternativamente, solo puede requerir cada uno por separado, pero puede tener problemas de entorno AR no configurado, etc.)

Luke Schafer
fuente
55
¡Esto funcionará, pero romperá el rastrillo en general! Después de agregar este cambio, intente rake -T sin una base de datos disponible. rake -T debería proporcionar una lista de tareas de rake sin necesidad de acceder a la base de datos.
irkenInvader
1
Después de hacer esto, encontrará que cualquier otra tarea de rastrillo que requiera inicializar la aplicación (es decir, activos de rastrillo: precompilación) fallará con "¡rastrillo cancelado! La aplicación ya se ha inicializado".
brent
11

Cuando comienzas a escribir tu rastrillo tareas de , use un generador para apagarlas por usted.

Por ejemplo:

rails g task my_tasks task_one task_two task_three 

Obtendrá un código auxiliar creado en lib / tareas llamado my_tasks.rake(obviamente use su 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 sus modelos de rieles, etc. estarán disponibles para el entorno actual dentro de cada bloque de tareas, a menos que esté utilizando el entorno de producción , en cuyo caso necesitará los modelos específicos que desea utilizar. Haga esto dentro del cuerpo de la tarea. (IIRC esto varía entre las diferentes versiones de Rails).

ocodo
fuente
2
¿No podría simplemente decir que environmentse requiere como una dependencia y luego decir la sintaxis en lugar de alentar al OP a confiar en utilidades "mágicas" que ni siquiera usan magia?
BalinKingOfMoria Reinstale CMs
3

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

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

El: la dependencia del entorno se llama correctamente, pero rake todavía puede no conocer otras gemas de las que dependen sus modelos, en un caso mío, 'protected_attributes'.

La respuesta es correr:

bundle exec rake test:new_task

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

Lex Lindsey
fuente
1

Genere la tarea usando el siguiente comando (espacio de nombres con el nombre de la tarea):

rails g task test new_task

Use la siguiente sintaxis para agregar lógica:

namespace :test do
  desc 'Test new task'
  task new_task: :environment do
    puts Parent.all.inspect
  end
end

Ejecute la tarea anterior con el comando siguiente:

bundle exec rake test:new_task  

o

 rake test:new_task
Ni3
fuente