Это звучит так, как будто выходит за рамки того, что на самом деле следует использовать для миграции, для преобразования схемы базы данных.
Вместо этого вам нужно выполнить задачу rake, возможно, в сочетании с объектом службы. Вы можете генерировать рейковые задачи с помощью:
rails g task products import
Генератор сгенерирует:
# lib\tasks\products.rake
namespace :products do
desc "TODO"
task import: :environment do
end
end
Эта задача может быть вызвана с помощью bin/rake products:import
в любой выбранной вами точке.
Конечно, не будет никакого вывода, так как задача еще ничего не делает. Фактическая реализация идет в блоке, переданном в task
. Тестирование Rake-задач может быть довольно сложным, поэтому я считаю, что лучше всего выполнять большинство реальных реализаций в сервисных объектах:
class ProductImporter
def initialize(env, **kwargs)
# set up
end
def call
# do actual work
# ...
teardown
end
def self.call(env, **kwargs)
new(kwargs).call
end
private
def teardown
# clean up
end
end
, которые легко протестировать, поскольку это просто старые ruby объекты и вы не беспокойтесь о таких вещах, как аргументы командной строки.
А затем просто вызывайте ваши службы из задачи:
# lib\tasks\products.rake
namespace :products do
desc "Import a list of products from..."
task import: :environment do
ProductImporter.call(Rails.env)
end
end
Это делает так, что вам просто нужно проверить, что ваши грабли задача вызывает службу с правильными аргументами.