5

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

class AppModule < ActiveRecord::Base
  belongs_to :app 
end

class AppModuleList < AppModule

end

class AppModuleSearch < AppModule

end

class AppModuleThumbs < AppModule

end

现在,在用户可以选择创建新 AppModules 的视图中,我希望他们从下拉菜单中进行选择。但是,我无法使用 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 %>

我得到:

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

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

4

2 回答 2

10

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

于 2010-11-14T11:39:08.377 回答
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 %> 
于 2012-02-14T22:19:27.520 回答