Как получить массив подклассов в Rails - PullRequest
5 голосов
/ 14 ноября 2010

У меня есть объект модели, который подклассов ActiveRecord.Кроме того, используя STI, я определил подклассы этого объекта, которые определяют различные типы и поведение.Структура выглядит примерно так:

class AppModule < ActiveRecord::Base
  belongs_to :app 
end

class AppModuleList < AppModule

end

class AppModuleSearch < AppModule

end

class AppModuleThumbs < AppModule

end

Теперь, когда у пользователя есть возможность создавать новые модули AppModules, я бы хотел, чтобы они выбирались из выпадающего меню.Однако я не смог получить список подклассов AppModule с помощью метода subclasses ():

<% 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>

Буду признателен за любую помощь.Большое спасибо!

Ответы [ 2 ]

10 голосов
/ 14 ноября 2010

Похоже, что subclasses и т. П. недавнее добавление (метод существует в различных классах в разные моменты времени, но его постоянно перемешивают и удаляют;эта ссылка, кажется, самая ранняя точка, где метод застрял).Если обновление до последней версии RoR не является возможным, вы можете написать свой собственный subclasses и заполнить его, используя Class#inherited (это то, что в RoR descendents_trackerделает).

5 голосов
/ 15 февраля 2012

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 %> 
...