252 Stimmen

Bieten Rails-Rake-Tasks Zugriff auf ActiveRecord-Modelle?

Ich versuche, eine benutzerdefinierte Rake-Aufgabe zu erstellen, aber es scheint, ich habe keinen Zugriff auf meine Modelle. Ich dachte, dies sei etwas, das implizit in der Rails-Aufgabe enthalten ist.

Ich habe den folgenden Code in lib/tasks/test.rake:

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

Und so sieht mein Elternmodell aus:

class Parent < ActiveRecord::Base
  has_many :children
end

Es ist ein ziemlich einfaches Beispiel, aber ich erhalte den folgenden Fehler:

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

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

Irgendwelche Ideen? Danke

437voto

gmoniey Punkte 7835

Ich habe es herausgefunden, die Aufgabe sollte wie folgt aussehen:

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

Beachten Sie die => :environment der Aufgabe hinzugefügte Abhängigkeit

17voto

Luke Schafer Punkte 9113

Sie benötigen möglicherweise Ihre Konfiguration (die alle gewünschten Modelle usw. enthalten sollte)

z. B:

require 'config/environment'

alternativ können Sie auch nur jeden einzeln anfordern, aber Sie könnten Probleme mit der Umgebung haben AR nicht eingerichtet usw.)

14voto

ocodo Punkte 28409

Wenn Sie mit dem Schreiben Ihrer Rechen Aufgaben, verwenden Sie einen Generator, der sie für Sie löscht.

Zum Beispiel:

rails g task my_tasks task_one task_two task_three 

Sie erhalten einen in lib/tasks erstellten Stub namens my_tasks.rake (Verwenden Sie natürlich Ihren eigenen Namespace.) Das sieht dann so aus:

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

Alle Ihre Schienenmodelle usw. sind für die aktuelle Umgebung in jedem Aufgabenblock verfügbar, es sei denn, Sie verwenden die Produktion In diesem Fall müssen Sie die spezifischen Modelle, die Sie verwenden möchten, anfordern. Tun Sie dies im Hauptteil der Aufgabe. (IIRC dies variiert zwischen verschiedenen Versionen von Rails.)

7voto

apadana Punkte 11390

Mit der neuen Ruby-Hash-Syntax (Ruby 1.9) wird die Umgebung wie folgt zum Rake-Task hinzugefügt:

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

6voto

Ni3 Punkte 246

Erzeugen Sie die Aufgabe mit dem folgenden Befehl (Namensraum mit Aufgabenname):

rails g task test new_task

Verwenden Sie die folgende Syntax, um Logik hinzuzufügen:

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

Führen Sie die obige Aufgabe mit dem folgenden Befehl aus:

bundle exec rake test:new_task  

ou

 rake test:new_task

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X