Здравствуйте. Я некоторое время искал решение для этого. Использование Rails 2.3.5
У меня есть родительский класс с несколькими дочерними классами, и из-за отсутствия файла длиной 1500 строк, дочерние классы хранятся в подкаталоге каталога app / models.
До недавнего времени, когда я просматривал этот пост: здесь
Я даже не мог загрузить дочерние классы
Теперь я хочу получить доступ к каждому ребенку способом, использующим метод класса self.inherited
как это:
class Project < ActiveRecord::Base
CHILDREN = []
def self.inherited(child)
super
CHILDREN << child
puts "CHILDREN.inspect: #{CHILDREN.inspect}"
end
def self.valid_child_types
CHILDREN.collect{ |child| child.project_type}
end
end
Временно я поместил несколько отладочных операторов, чтобы получить более полное представление о том, как все загружается. Я запустил консоль и заметил следующее:
>> Project
require_or_load /Users/frankdrebin/Sites/cerp/app/models/project.rb
loading /Users/frankdrebin/Sites/cerp/app/models/project
require_or_load /Users/frankdrebin/Sites/cerp/app/models/status.rb
loading /Users/frankdrebin/Sites/cerp/app/models/status
=> Project(id: integer, url: string, deadline: date, state: string, type: string, priority: integer, status_id: integer)
>> Project::CHILDREN
=> []
>> ArticleProject
require_or_load /Users/frankdrebin/Sites/cerp/app/models/projects/article_project.rb
loading /Users/frankdrebin/Sites/cerp/app/models/projects/article_project
CHILDREN.inspect: [ArticleProject(id: integer, url: string, deadline: date, state: string, type: string, priority: integer, status_id: integer)]
require_or_load /Users/frankdrebin/Sites/cerp/vendor/gems/state_machine- 0.7.3/lib/state_machine.rb
loading /Users/frankdrebin/Sites/cerp/vendor/gems/state_machine-0.7.3/lib/state_machine
=> ArticleProject(id: integer, url: string, deadline: date, state: string, type: string, priority: integer, status_id: integer)
>> Project::CHILDREN
=> [ArticleProject(id: integer, url: string, deadline: date, state: string, type: string, priority: integer, status_id: integer)]
>>
Я уверен, что есть менее изящные решения, такие как помещение дочерних классов обратно в один гигантский файл, но я бы хотел избежать этого, если это вообще возможно.
Спасибо