На самом деле, пользовательская реализация отслеживания подклассов не является необходимой даже в Rails 2.3. Уже существует метко названный метод «подклассы», внедренный в класс ActiveSupport, который возвращает их для вас в лексически отсортированном порядке. Таким образом, вы могли бы написать
class Parent < ActiveRecord::Base
def self.select_options
subclasses.map{ |c| c.to_s }
end
end
class Child3 < Parent
end
class Child1 < Parent
end
class Child2 < Parent
end
Или вы могли бы использовать тот же трюк, что и там, и использовать
class Parent < ActiveRecord::Base
def self.select_options
Object.subclasses_of(self).map{ |c| c.to_s }.sort
end
end
Только что проверил это в Rails 2.3.14 (Ruby 1.8.7-p352) и получил ожидаемый результат в обоих случаях:
>> Parent.select_options
=> ["Child1", "Child2", "Child3"]
Необходимость предварительной загрузки дочерних классов ИППП в среду разработки по-прежнему актуальна. Слава Алексею Райснеру за подсказку в его блоге .