Rails 2和3之间子类功能的差异

时间:2010-12-08 21:54:57

标签: ruby-on-rails ruby subclass

假设我有类似的东西

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的新功能?

2 个答案:

答案 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