如何在Rails中获取子类数组

Eng*_*epe 5 ruby reflection inheritance metaprogramming inspect

我有一个模型对象,它是ActiveRecord的子类.此外,使用STI,我定义了此对象的子类,它定义了不同的类型和行为.结构看起来像这样:

class AppModule < ActiveRecord::Base
  belongs_to :app 
end

class AppModuleList < AppModule

end

class AppModuleSearch < AppModule

end

class AppModuleThumbs < AppModule

end
Run Code Online (Sandbox Code Playgroud)

现在,在用户可以选择创建新AppModule的视图中,我希望他们从下拉菜单中进行选择.但是我无法使用subclasses()方法获取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 %>
Run Code Online (Sandbox Code Playgroud)

我明白了:

NoMethodError: undefined method `subclasses' for #<AppModule:0x1036b76d8>
Run Code Online (Sandbox Code Playgroud)

我很感激任何帮助.非常感谢!

out*_*tis 10

它看起来subclasses好像是最近的一个添加(该方法存在于各个时间点的各个类,但不断被改组和删除;该链接似乎是该方法所停留的最早的点).如果升级到最新版本的RoR不是一个选项,您可以自己编写subclasses并使用Class#inherited它填充(这是RoR的descendents_tracker功能).

  • 对于 Google 在这里指导的任何人,如果您的类是延迟加载的,则 DescendantsTracker 在使用它们之前不会知道它们。 (2认同)

Mik*_*ike 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 %> 
Run Code Online (Sandbox Code Playgroud)