wake-up-neo.com

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

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

Ich habe den folgenden Code in lib/task/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 die folgende Fehlermeldung:

/> 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? Vielen Dank

212
gmoniey

Um es herauszufinden, sollte die Aufgabe so aussehen:

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

Beachten Sie die => :environment-Abhängigkeit, die der Aufgabe hinzugefügt wurde

379
gmoniey

möglicherweise müssen Sie Ihre Konfiguration anfordern (die alle erforderlichen Modelle usw. angeben muss).

z.B:

require 'config/environment'

alternativ können Sie jedes nur einzeln anfordern, aber Sie haben möglicherweise Umgebungsprobleme, die nicht eingerichtet sind.

16
Luke Schafer

Wenn Sie mit dem Schreiben Ihrer rake - Aufgaben beginnen, verwenden Sie einen Generator, um sie für Sie auszulagern.

Zum Beispiel:

Rails g task my_tasks task_one task_two task_three 

Sie erhalten einen in lib/task erstellten Stub mit dem Namen my_tasks.rake (verwenden Sie offensichtlich Ihren eigenen Namespace.)

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 Rails-Modelle usw. sind für die aktuelle Umgebung in jedem Taskblock verfügbar, sofern Sie nicht die production -Umgebung verwenden. In diesem Fall müssen Sie die spezifischen Modelle benötigen, die Sie verwenden möchten. Tun Sie dies innerhalb des Körpers der Aufgabe. (IIRC variiert zwischen den verschiedenen Rails-Versionen.)

11
ocodo

Die Abhängigkeit von der Umgebung ist ziemlich korrekt, aber der Rake kennt möglicherweise noch keine Informationen über andere Edelsteine, von denen Ihre Modelle abhängen - in einem meiner Fälle 'protected_attributes'.

Die Antwort lautet:

bundle exec rake test:new_task

Dies garantiert, dass die Umgebung alle in Ihrer Gemfile angegebenen Edelsteine ​​enthält.

2
Lex Lindsey

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

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

Task generieren mit folgendem Befehl (Namespace mit Taskname):

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  

oder

 rake test:new_task
0
Ni3