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

时间:2017-01-15 19:50:22

标签: ruby-on-rails ruby ruby-on-rails-5 rake-task

我有一个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任务调用时需要该文件吗?

非常感谢

2 个答案:

答案 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的更多信息。