假设我有类似的东西
class Major < ActiveRecord::Base
def self.my_kids
self.subclasses.collect {|type| type.name}.sort
end
end
class MinorOne < Major
end
class MinorTwo < Major
end
在Rails 2.3中,我可以调用Major.my_kids并获取子类名称的数组,但在Rails 3.0.3中,我得到一个空数组,除非我先加载子类。这对我来说似乎不对,我错过了什么,还是Rails 3的新功能?
答案 0 :(得分:2)
我知道Rails 2和3之间在使用subclasses
方法方面没有区别。你可能认为它之前有效,因为子类已经加载了。当Rails动态加载大多数文件时,除非在同一文件中定义,否则父类无法知道从中派生的任何类。确保加载所有模型的最简单方法是,您只需在require
目录中的所有文件上调用app/models
:
Dir.glob(RAILS_ROOT + '/app/models/*.rb').each { |file| require file }
另外需要注意的是,在Rails控制台中发出subclasses
命令后,reload!
方法不起作用。
答案 1 :(得分:0)
你在Rails 3中获得一个空数组的原因很可能是因为Rails 3使用了自动加载。
如果您打开Rails控制台并引用子类的名称,那么在父类上运行“子类”方法,您将看到它的工作原理。这是因为当你引用它们时,Rails 3只会将类加载到你引用的内存中。
我最终强迫我的类从我在/ lib下创建的库加载的方式是使用以下代码添加到依赖于这些类的方法中:
# load feature subclasses
my_classes_path = File.expand_path(File.dirname(__FILE__)) + "/my_classes"
if File.directory?(my_classes_path)
Dir.glob(my_classes_path + "/*.rb").each do |f|
load f
end
end