2010-12-08 155 views
2

比方說,我有這樣的事情差異功能Rails和2之間3

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

我知道Rails 2和3之間關於使用subclasses方法的區別。你可能會認爲它以前是有效的,因爲這些子類已經被加載了。由於Rails動態加載大多數文件,父類無法知道從它派生的任何類,除非它在相同的文件中定義。以確保所有車型最簡單的方式加載,你可以簡單地調用上的所有文件requireapp/models目錄:

Dir.glob(RAILS_ROOT + '/app/models/*.rb').each { |file| require file } 

另一個要注意的是,subclasses方法不發出reload!命令後Rails控制檯。

+0

`Dir.glob(RAILS_ROOT +'/app/models/*.rb').each {| file | require_dependency file}`可能會更好,速度更快。在環境中的`config.to_prepare {}`或`config.after_initialize {}`塊中引用它很有用。 – MegaTux 2011-08-16 18:35:55

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 
相關問題