调用rake任务时无法加载命名空间模型



我得到了一个调用其他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_planes.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时,我会得到这个错误

rake中止!LoadError:无法自动加载常量公司::ProfilePlan,预期/主页//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

轨道5.0.1Ruby 2.4.0

该应用程序刚刚从4.2升级到5

当我需要整个路径时,它可以工作:

require "#{Rails.root}/app/models/company/profile_plan.rb"

但这对我来说似乎很奇怪,因为在错误消息rails中有通往Model的正确路径。有人知道我为什么在从另一个rake任务调用时需要该文件吗?

非常感谢

好吧,rake似乎并不急于加载,所以当你单独调用create_company_plans.rake时,它会加载引用的对象,然而当你从另一个rake调用它时,它不知道你会需要它们,所以它们不会被加载。

你可以看看另一个与你相似的QA。

我想也许你不需要要求整个路径,只需要:

require 'models/company/profile_plan'

据我所知,您可能可以通过reenablerevoke来克服这个问题,如下所示。如果这不起作用,请原谅。

['test_data:create_company_plans', 'test_data:create_companies'].each do |task|
Rake::Task[task].reenable
Rake::Task[task].invoke
end

关于如何在rake任务中运行rake任务,有更多关于这个stackoverflow问题的信息。

最新更新