ruby on rails - transport - As tarefas de rake rails fornecem acesso aos modelos do ActiveRecord?




rails elasticsearch query (4)

Eu estou tentando criar uma tarefa de ancinho personalizado, mas parece que eu não tenho acesso aos meus modelos. Eu pensei que isso era algo implicitamente incluído na tarefa de trilhos.

Eu tenho o seguinte código em lib / tasks / test.rake:

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

E aqui está o meu modelo parental:

class Parent < ActiveRecord::Base
  has_many :children
end

É um exemplo bem simples, mas recebo o seguinte erro:

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

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

Alguma ideia? obrigado


A dependência: environment é bem corretamente chamada, mas o rake ainda pode não conhecer outras gemas das quais seus models dependem - em um caso meu, 'protected_attributes'.

A resposta é executar:

bundle exec rake test:new_task

Isso garante que o ambiente inclua quaisquer gemas especificadas no seu Gemfile.


Com a nova sintaxe de hash ruby ​​(Ruby 1.9), o ambiente será adicionado desta forma à tarefa rake:

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

Gerar tarefa usando o comando abaixo (namespace com nome da tarefa):

rails g task test new_task

Use abaixo a sintaxe para adicionar lógica:

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

Execute acima da tarefa usando o comando abaixo:

bundle exec rake test:new_task  

ou

 rake test:new_task

Quando você começar a escrever suas tarefas de rake , use um gerador para eliminá-las para você.

Por exemplo:

rails g task my_tasks task_one task_two task_three 

Você obterá um stub criado em lib / tasks chamado my_tasks.rake (obviamente use seu próprio namespace.) O que será assim:

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 os seus modelos de trilhos etc. estarão disponíveis para o ambiente atual de dentro de cada bloco de tarefas, a menos que você esteja usando o ambiente de produção. Nesse caso, é necessário exigir os modelos específicos que deseja usar. Faça isso dentro do corpo da tarefa. (IIRC isso varia entre diferentes versões do Rails.)







task