Предоставляют ли рейки рейк-задачи доступ к моделям ActiveRecord?

Я пытаюсь создать пользовательскую задачу rake, но, похоже, у меня нет доступа к моим моделям. Я думал, что это было неявно включено в задачу 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)

Любые идеи? Благодаря

Ответ 1

Выяснилось, задача должна выглядеть так:

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

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

Ответ 2

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

например:

require 'config/environment'

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

Ответ 3

Когда вы начинаете писать свои задачи 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.)

Ответ 4

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

Ответ на запуск:

bundle exec rake test:new_task

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