Чи надають рейкові завдання граблі доступ до моделей ActiveRecord?


235

Я намагаюся створити спеціальне завдання граблі, але, здається, у мене немає доступу до моїх моделей. Я думав, що це щось неявно включено в завдання рейки.

У lib / task / 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)

Будь-які ідеї? Дякую

Відповіді:


410

Зрозумівши це, завдання має виглядати так:

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

Зауважте => :environmentзалежність, додану до завдання


4
що означає цей синтаксис? це присвоєння new_taskпоточному середовищу? яке поточне значення :environment? Google не допомагає.
Скотт Коутс

12
@scoarescoare: середовище тут - залежність, тому під час запуску new_taskспочатку завантажте середовище (завантажте свої моделі), а потім запустіть new_task.
bigpotato

3
@scoarescoare ви можете перевірити користувальницький рейк doc , перший приклад вам скаже
lazybios

як досягти того самого в Сінатрі?
AMBasra

Ім'я моделі повинно дотримуватися всіх, і без неї вона не працює, як TodoList.all.each не TodoList.each idk, чому вона здається працює?
Kick Buttowski

17

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

наприклад:

require 'config/environment'

або ви можете просто вимагати кожного окремо, але у вас можуть виникнути проблеми з оточенням, AR не налаштовані тощо)


5
Це спрацює, але загалом зламає граблі! Після додавання цієї зміни спробуйте граблі -T без наявності БД. rake -T повинен із задоволенням надавати список завдань граблів, не потребуючи доступу до БД!
irkenInvader

1
Зробивши це, ви побачите, що будь-які інші завдання граблі, які потребують ініціалізації програми (тобто активізація граблів: попередній компіляція), не зможуть виконати "рейк перерваний! Програма вже ініціалізована".
brent

11

Коли ви почнете писати свої граблі завдання на , використовуйте генератор, щоб заглушити їх.

Наприклад:

rails g task my_tasks task_one task_two task_three 

Ви отримаєте заглушку, створену в lib / завдання з назвою 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

Усі ваші моделі рейок тощо будуть доступні для поточного середовища з кожного блоку завдань, якщо ви не використовуєте виробниче середовище, і в цьому випадку вам потрібно вимагати конкретні моделі, які ви хочете використовувати. Зробіть це в рамках завдання. (IIRC це залежить від різних версій Rails.)


2
Не могли б ви просто сказати, що environmentце потрібно як залежність, а потім сказати синтаксис, а не спонукати ОП покладатися на "магічні" утиліти, які навіть не використовують ніякої магії?
Відшкодування BalinKingOfMoria відновити

3

З новим синтаксисом хеш-рубіну (Ruby 1.9) середовище буде додано таким чином до завдання граблі:

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

2

Залежність від навколишнього середовища цілком коректно закликана, але граблі все ще можуть не знати про інші дорогоцінні камені, від яких залежать ваші моделі - в одному з моїх випадків, "захищені_потоки".

Відповідь полягає у запуску:

bundle exec rake test:new_task

Це гарантує, що середовище включає будь-які дорогоцінні камені, вказані у вашому Gemfile.


1

Створіть завдання за допомогою команди нижче (простір імен з назвою завдання):

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.