Предоставляют ли рельсовые задачи доступ к моделям ActiveRecord? - PullRequest
220 голосов
/ 18 мая 2009

Я пытаюсь создать пользовательское задание на рейк, но, похоже, у меня нет доступа к моим моделям. Я думал, что это было что-то неявно включенное в задачу rails.

У меня есть следующий код в lib / tasks / test.rake:

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

А вот как выглядит моя родительская модель:

class Parent < ActiveRecord::Base
  has_many :children
end

Это довольно простой пример, но я получаю следующую ошибку:

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

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

Есть идеи? Спасибо

Ответы [ 6 ]

382 голосов
/ 18 мая 2009

Разобрался, задача должна выглядеть так:

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

Обратите внимание на зависимость => :environment, добавленную в задачу

16 голосов
/ 18 мая 2009

вам может потребоваться ваша конфигурация (в которой должны быть указаны все необходимые модели и т. Д.)

например:

require 'config/environment'

в качестве альтернативы вы можете просто требовать каждого отдельно, но у вас могут быть проблемы с окружением, если AR не настроен и т. Д.)

11 голосов
/ 29 августа 2013

Когда вы начнете писать задачи rake , используйте генератор, чтобы заглушить их для вас.

Например:

rails g task my_tasks task_one task_two task_three 

Вы получите заглушку, созданную в lib / tasks под названием my_tasks.rake (очевидно, используйте ваше собственное пространство имен.), Которая будет выглядеть следующим образом:

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

Все ваши модели рельсов и т. Д. Будут доступны для текущей среды из каждого блока задач, если только вы не используете среду production , и в этом случае вам потребуются конкретные модели, которые вы хотите использовать. Сделайте это в теле задачи. (IIRC это варьируется между различными версиями Rails.)

2 голосов
/ 15 июня 2018

С новым синтаксисом хэша ruby ​​(Ruby 1.9) среда будет добавлена ​​в задачу rake следующим образом:

namespace :test do
  task new_task: :environment do
    puts Parent.all.inspect
  end
end
2 голосов
/ 05 июля 2016

Зависимость окружения: вполне корректно вызывается, но rake все еще может не знать о других драгоценных камнях, от которых зависят ваши модели - в одном из моих случаев - protected_attributes.

Ответ должен работать:

bundle exec rake test:new_task

Это гарантирует, что среда включает любые драгоценные камни, указанные в вашем Gemfile.

0 голосов
/ 28 декабря 2018

Создать задачу, используя следующую команду (пространство имен с именем задачи):

rails g task test new_task

Используйте следующий синтаксис для добавления логики:

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

Запустите вышеуказанную задачу, используя следующую команду:

bundle exec rake test:new_task  

или

 rake test:new_task
...