2010-11-14 30 views
5

我有一個模型對象,它的子類ActiveRecord。另外,使用STI,我定義了這個對象的子類,它定義了不同的類型和行爲。結構看起來是這樣的:現在如何在Rails中獲取一個子類的數組

class AppModule < ActiveRecord::Base 
    belongs_to :app 
end 

class AppModuleList < AppModule 

end 

class AppModuleSearch < AppModule 

end 

class AppModuleThumbs < AppModule 

end 

,在用戶創建新的AppModules選擇一個觀點,我想他們從下拉菜單中選擇。不過,我一直沒能得到使用的子類(的AppModule的子類的列表)方法:

<% form_for(@app_module) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :type %><br /> 
    <%= f.select(:type, options_from_collection_for_select(@app_module.subclasses().map{ |c| c.to_s }.sort)) %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

我得到:

NoMethodError: undefined method `subclasses' for #<AppModule:0x1036b76d8> 

我會很感激的任何幫助。非常感謝!

+0

您正在使用哪個版本的Ruby on Rails? – outis 2010-11-14 11:43:32

+0

Rails 2.3.8,Ruby 1.8.7 – 2010-11-14 12:02:44

+0

類在[3.0.0](http://rubydoc.info/docs/rails/3.0.0/Class#descendants-instance_method)中有'descendents'方法,但不是[2.3.8](http://rubydoc.info/docs/rails/2.3.8/Class#descendants-instance_method)。 – outis 2010-11-14 12:21:17

回答

10

看起來好像是subclasses之類的是recent addition(該方法存在於各個時間點的各種類別中,但不斷被混洗和移除;該鏈接似乎是該方法卡住的最早點) 。如果升級到最新版本的RoR不是一種選擇,您可以編寫自己的subclasses並使用Class#inherited(這是RoR的descendents_tracker所做的)填充它。

+1

對於Google指定的任何人,如果你的類是懶加載的,DescendantsTracker在使用它們之前不會知道它們。 – 2017-02-24 19:15:18

5

AppModule.descendants.map &:name是你在找什麼。如:

<% form_for(@app_module) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :type %><br /> 
    <%= f.select(:type, options_from_collection_for_select(AppModule.descendants.map(&:name).sort)) %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %>