Если вы уже давно работаете с 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 без каких-либо ошибок.