Ruby on rails 需要依赖关系才能获取Rails子类

Ruby on rails 需要依赖关系才能获取Rails子类,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有以下设置: app/models/my_module/service.rb module MyModule class Service < ActiveRecord::Base def self.types self.subclasses end def self.raw_types self.types.map { |c| c.name.split("::").last } end end end require_d

我有以下设置:

app/models/my_module/service.rb

module MyModule
  class Service < ActiveRecord::Base
    def self.types
      self.subclasses
    end

    def self.raw_types
      self.types.map { |c| c.name.split("::").last }
    end
  end
end

require_dependency "my_module/service/rack"
require_dependency "my_module/service/rails"
require_dependency "my_module/service/sinatra"
到我的service.rb文件

如果我不添加这三行:

require_dependency "my_module/service/rack"
require_dependency "my_module/service/rails"
require_dependency "my_module/service/sinatra"
MyModule::Service.raw_types
=> []
MyModule::Service.raw_types
=> ["Rack", "Rails", "Sinatra"]
如果我添加三行:

require_dependency "my_module/service/rack"
require_dependency "my_module/service/rails"
require_dependency "my_module/service/sinatra"
MyModule::Service.raw_types
=> []
MyModule::Service.raw_types
=> ["Rack", "Rails", "Sinatra"]
有人有主意吗

顺便说一句:我使用Ruby 2.0.0-preview1、Rails 4.0.0.rc1,并使用

rails plugin new MyModule

默认情况下,在开发环境中,Rails将通过查看常规位置(例如,
/app/models/my_module/service/rack.rb
MyModule::service::rack
)自动加载
app
的常用子目录中的常量。此自动加载在第一次引用常量时发生,而不是在应用程序初始化时

但这意味着在引用常量之前,除非明确需要,否则不会加载定义该常量的文件

因此,当您调用
MyModule::Service.raw_types
时,如果尚未定义,
MyModule::Service
将从
app/models/myu module/Service.rb
加载。但是,如果尚未引用其子类,则不会定义这些常量,除非明确需要定义这些常量的文件。因此,需要在该方法调用时自动加载的文件中包含这些文件,才能使它们可用


寓意:如果您想确保无论何时
MyModule::Service
都定义了
MyModule::Service
的子类,您需要在
/app/models/my_module/Service.rb

MyModule::Service.types工作吗?问题是为什么需要文件还是为什么填充数组?当您需要文件时,您添加了3个类,所有子类都提供服务,因此
服务。子类
返回这3个类。想法:其中一个文件将
子类
添加到类中。BettySt:仅当我需要父类中的文件时。克里斯:我的问题是为什么我需要这三个文件,而不是方法调用,方法调用指向子类自动需要我的文件,因为类是通过父类隐式调用的。用户:你是什么意思?我还没有定义任何monkey补丁。好吧,我已经这么认为了,但我希望Rails能够在调用方法时修复自动加载,因为需要通过父类方法调用这些类。。可能是Rails bug吗?我理解从“ruby视图”加载,但不是从“rails视图”加载。当应用程序甚至不知道这些常量存在时,它如何知道这些常量是必需的?我认为在定义超类的文件中要求子类没有任何害处。或者,您可以将它们全部加载到config/boot.rb中,以便它们在应用程序初始化时出现。但如果Rails具有这样一种行为,即它搜索子文件夹(类似于父类周围的模块),以检查是否定义了子类,那将是非常好的。那太好了:)。但是无论如何,我只会在rails初始化过程中加载它们。顺便说一句,1作为您的解释。因此,根据这个解释,如果您省略了
require\u依赖项
,然后调用其中一个子类,例如
MyModule::Service::Sinatra.new
,那么,如果下一个调用是
MyModule::Service.raw\u types
,它会返回
['Sinatra']