Как получить доступ к моделям Rails ActiveRecord внутри задачи Rake

Если вы уже давно работаете с Ruby on Rails, вы наверняка сталкивались с Rake. Написанный покойным Джимом Вейрихом, Rake является для Ruby тем же, чем Make для C. Очень легко создавать пользовательские задачи Rake для упрощения рабочих процессов разработки. Rails даже предоставляет генератор (rails g task) для их создания за вас.

Однако у многих начинающих разработчиков Rails (включая меня) при изучении Rails возникает вопрос: как получить доступ к среде Rails в задаче Rake, что очень полезно для доступа к моделям ActiveRecord или выполнения запросов к базе данных. В этой статье показано, как это сделать.

TL; DR

Добавьте задачу :environment в качестве зависимости для вашей пользовательской задачи.

task count_users: [:environment] do
  ...
end
Вход в полноэкранный режим Выйти из полноэкранного режима

Длинный ответ

Вот простая задача Rake, которая пытается использовать модель ActiveRecord с именем User.

# lib/tasks/transport.rake

desc "count the number of users in the system"
task :count_users do
  puts User.count
end
Войти в полноэкранный режим Выйти из полноэкранного режима

Если я попытаюсь запустить эту задачу Rake как есть, Rails выдаст NameError, поскольку не знает, на что ссылается токен User.

bin/rails count_users
rails aborted!
NameError: uninitialized constant User

  puts User.count
       ^^^^^^^^^^^^^^^
Вход в полноэкранный режим Выход из полноэкранного режима

Чтобы сделать модели ActiveRecord доступными в задачах Rake, нам нужно сказать Rails загрузить окружение перед запуском задачи. Это похоже на то, что происходит при запуске консоли Rails. Загрузка среды Rails дает доступ к моделям ActiveRecord, базе данных и многому другому.

Rails предоставляет задачу :environment для загрузки окружения. В терминологии Rake ваша задача зависит от задачи :environment, поскольку она должна быть выполнена до вашей задачи.

# lib/tasks/transport.rake

desc "count the number of users in the system"
task count_users: [:environment] do
  puts User.count
end
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь вы можете получить доступ к модели User в задаче rake без каких-либо ошибок.

Оцените статью
Procodings.ru
Добавить комментарий