我有一个rake任务调用其他rake任务,因此可以轻松重置我的开发数据。
第一个rake任务(lib / tasks / populate.rake)
# Rake task to populate development database with test data
# Run it with "rake db:populate"
namespace :db do
desc 'Erase and fill database'
task populate: :environment do
...
Rake::Task['test_data:create_company_plans'].invoke
Rake::Task['test_data:create_companies'].invoke
Rake::Task['test_data:create_users'].invoke
...
end
end
第二个rake任务(lib / tasks / populate_sub_scripts / create_company_plans.rake)
namespace :test_data do
desc 'Create Company Plans'
task create_company_plans: :environment do
Company::ProfilePlan.create!(name: 'Basic', trial_period_days: 30, price_monthly_cents: 4000)
Company::ProfilePlan.create!(name: 'Professional', trial_period_days: 30, price_monthly_cents: 27_500)
Company::ProfilePlan.create!(name: 'Enterprise', trial_period_days: 30, price_monthly_cents: 78_500)
end
end
当我运行bin / rake db:populate然后我收到此错误
耙子流产了! LoadError:无法自动加载常量 公司:: ProfilePlan,预计 /home/.../app/models/company/profile_plan.rb来定义它
但是当我独立运行第二个rake任务时,效果很好。
模型(路径:/ home /.../ app / models / company / profile_plan.rb)
class Company::ProfilePlan < ActiveRecord::Base
# == Constants ============================================================
# == Attributes ===========================================================
# == Extensions ===========================================================
monetize :price_monthly_cents
# == Relationships ========================================================
has_many :profile_subscriptions
# == Validations ==========================================================
# == Scopes ===============================================================
# == Callbacks ============================================================
# == Class Methods ========================================================
# == Instance Methods =====================================================
end
Rails 5.0.1 Ruby 2.4.0
该应用程序刚刚从4.2升级到5
当我需要整条路径时,它会起作用:
require "#{Rails.root}/app/models/company/profile_plan.rb"
但这对我来说似乎很奇怪,因为在错误消息中rails拥有正确的模型路径。有人知道为什么我从另一个rake任务调用时需要该文件吗?
非常感谢
答案 0 :(得分:1)
好吧,似乎rake并不急于加载,所以当你单独调用create_company_plans.rake
时它会加载被引用的对象,但是当你从另一个rake调用它时,它并不知道你将需要它们,因此它们不会被加载。
您可以查看与您类似的其他QA。
我想也许你不需要整条路径,只需:
require 'models/company/profile_plan'
答案 1 :(得分:1)
根据我的理解,你可以通过reenable
然后revoke
完成下面给出的任务来克服这个问题。请原谅我,如果这不起作用。
['test_data:create_company_plans', 'test_data:create_companies'].each do |task|
Rake::Task[task].reenable
Rake::Task[task].invoke
end
有关此stackoverflow问题how-to-run-rake-tasks-from-within-rake-tasks的更多信息。