Le attività di rake delle rotaie forniscono l'accesso ai modelli ActiveRecord?


235

Sto cercando di creare un'attività di rake personalizzata, ma sembra che non abbia accesso ai miei modelli. Ho pensato che questo fosse qualcosa di implicitamente incluso nel compito delle rotaie.

Ho il seguente codice in lib / task / test.rake:

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

Ed ecco come appare il mio modello genitore:

class Parent < ActiveRecord::Base
  has_many :children
end

È un esempio piuttosto semplice, ma viene visualizzato il seguente errore:

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

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

Qualche idea? Grazie

Risposte:


410

Capito, il compito dovrebbe apparire come:

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

Notare la => :environmentdipendenza aggiunta all'attività


4
cosa significa questa sintassi? si sta assegnando new_taskall'ambiente attuale? qual è il valore attuale di :environment? google non aiuta.
Scott Coates,

12
@scoarescoare: qui l'ambiente è la dipendenza, quindi durante l'esecuzione new_task, carica prima l'ambiente (carica i tuoi modelli), quindi esegui new_task.
bigpotato

3
@scoarescoare puoi controllare il rake doc personalizzato , il primo esempio ti dirà
lazybios

come ottenere la stessa cosa in Sinatra?
AMBasra,

il nome del modello deve seguire tutto e non funziona senza di esso come TodoList.all.each non TodoList.each idk perché sembra funzionare?
Calcia Buttowski il

17

potrebbe essere necessario richiedere la configurazione (che dovrebbe specificare tutti i modelli richiesti, ecc.)

per esempio:

require 'config/environment'

in alternativa puoi semplicemente richiederli separatamente, ma potresti avere problemi di ambiente AR non impostati ecc.)


5
Funzionerà, ma interromperà il rastrello in generale! Dopo aver aggiunto questa modifica, prova a rake -T senza un DB disponibile. rake -T dovrebbe fornire felicemente un elenco di attività rake senza la necessità di accedere al DB!
irkenInvader,

1
Dopo aver fatto ciò, scoprirai che qualsiasi altra attività di rake che richiede l'inizializzazione dell'applicazione (es. Asset di rake: precompilare) fallirà con "rake interrotto! L'applicazione è già stata inizializzata".
brent,

11

Quando inizi a scrivere le tue attività di rake , usa un generatore per eliminarle.

Per esempio:

rails g task my_tasks task_one task_two task_three 

Otterrai uno stub creato in lib / task chiamato my_tasks.rake(ovviamente usa il tuo spazio dei nomi.) Che assomiglierà a questo:

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

Tutti i modelli di rotaie, ecc. Saranno disponibili per l'ambiente corrente all'interno di ciascun blocco attività, a meno che non si stia utilizzando l' ambiente di produzione , nel qual caso è necessario richiedere i modelli specifici che si desidera utilizzare. Fallo nel corpo del compito. (IIRC questo varia tra le diverse versioni di Rails.)


2
Non potresti semplicemente dire che environmentè richiesto come dipendenza e quindi dire la sintassi piuttosto che incoraggiare l'OP a fare affidamento su utility "magiche" che non usano nemmeno alcuna magia?
BalinKingOfMoria Ripristina CM il

3

Con la nuova sintassi hash ruby ​​(Ruby 1.9) l'ambiente verrà aggiunto in questo modo all'attività rake:

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

2

La dipendenza: ambiente è abbastanza correttamente chiamata, ma il rake potrebbe ancora non conoscere altre gemme da cui dipendono i tuoi modelli - in un mio caso, 'protect_attributes'.

La risposta è eseguire:

bundle exec rake test:new_task

Questo garantisce che l'ambiente includa tutte le gemme specificate nel tuo Gemfile.


1

Genera attività utilizzando il comando seguente (spazio dei nomi con nome attività):

rails g task test new_task

Utilizzare la sintassi seguente per aggiungere la logica:

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

Esegui sopra l'attività usando il comando seguente:

bundle exec rake test:new_task  

o

 rake test:new_task
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.