Проблема в том, что в вашей среде разработки ваши модели перезагружаются при каждом запросе, так что изменения в этих классах вступают в силу, и вам не нужно перезагружать сервер каждый раз, когда вы вносите изменения в исходный код.Вы можете увидеть это поведение в консоли:
User.object_id
=> 2203143360
reload!
=> true
User.object_id
=> 2212653160
Это означает, что когда вы вызываете @models.include?(klass)
, вы фактически проверяете текущее создание этого объекта по сравнению с предыдущим запросом.Что вы заметите, так это то, что со временем ваша память становится раздутой, потому что эти объекты не будут удалены - поскольку сборщик мусора будет держать их рядом из-за ссылки на них в переменной экземпляра @models.Это не будет проблемой в работе, потому что классы загружаются только один раз, но это вызовет у вас проблемы при разработке.
Чтобы обойти это, я бы рекомендовал сделать что-то вроде этого:
module EngineName
class Models
class << self
def all
@models ||= {}
end
alias_method :models, :all
def register(klass)
if @models.nil?
@models = {klass.name => klass}
else
@models[klass.name] = klass unless excluded_models.keys.include?(klass.name)
end
end
alias_method :add, :register
end
end
end
Использование хэша позволит вам отслеживать модели по их именам, и всякий раз, когда появляется новая версия модели, она заменяет старую устаревшую версию.Это должно помочь в вашей среде разработки.Чтобы получить список всех моделей, вы просто используете @models.values
, а для получения списка названий моделей вы просто используете @models.keys
.