Невозможно загрузить модель с пространством имен при вызове задачи 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

вторая задача с граблями (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: невозможно автозагрузить константу Company :: ProfilePlan, ожидалось, что /home/.../app/models/company/profile_plan.rb ее определит

но когда я запускаю вторую задачу грабли независимо, она работает хорошо.

Модель (путь: /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?

Большое Вам спасибо


person Flo    schedule 15.01.2017    source источник
comment
Но у вас /home/.../app/models/company/profile_plan.rb верно?   -  person mikdiet    schedule 15.01.2017
comment
@MikDiet, спасибо. да, я добавил их в свой вопрос   -  person Flo    schedule 15.01.2017
comment
Попробуйте определить модуль компании module Company class ProfilePlan < ...   -  person taro    schedule 20.01.2017
comment
@taro, спасибо за идею, я тоже пробовал это раньше, но получаю: TypeError: Company - это не модуль, я думаю, это потому, что у меня также есть модель с именем Company   -  person Flo    schedule 20.01.2017


Ответы (2)


Что ж, похоже, что грабли не загружаются, поэтому, когда вы вызываете только create_company_plans.rake, он загружает упомянутые объекты, однако, когда вы вызываете его из другого грабли, он не знает, что они вам понадобятся, и поэтому они не загружаются.

Вы можете взглянуть на этот другой QA, похожий на ваш.

Я думаю, что, возможно, вам не нужно требовать весь путь, просто:

require 'models/company/profile_plan'
person Rafael Costa    schedule 20.01.2017
comment
require 'profile_plan' возвращает ошибку LoadError: невозможно загрузить такой файл - profile_plan - person Flo; 20.01.2017
comment
что, если ты require 'company'? - person Rafael Costa; 20.01.2017
comment
У меня грабли прерваны! LoadError: невозможно автозагрузить константу Company :: ProfilePlan, ожидалось, что /home/.../app/models/company/profile_plan.rb ее определит - person Flo; 20.01.2017
comment
Да посмотрите на мой вопрос, обновил. требовать файл с полным путем работает. Но я не уверен, почему вообще произошла эта ошибка. - person Flo; 20.01.2017
comment
Большое спасибо за объяснение :) - person Flo; 20.01.2017
comment
если вам нужен каждый файл, на который вы ссылаетесь, он может повторяться. вероятно, лучше было бы реорганизовать грабли в вашу основную кодовую базу и вызывать эти методы из задачи. - person max pleaner; 23.01.2017

Насколько я понимаю, вы, вероятно, можете решить проблему, reenable взяв, а затем revoke выполнив задачу, как указано ниже. Простите меня, если это не сработает.

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

Дополнительная информация по этому вопросу о переполнении стека как запустить- rake-tasks-from-inside-rake-tasks.

person Sony Mathew    schedule 22.01.2017