Nano Hash - криптовалюты, майнинг, программирование

Как перезагрузить файлы в app/models/subdirectory в среде dev для STI

Я реализовал STI в одной из своих моделей, используя несколько советов от Alex Запись в блоге Рейснера. У меня уже были все мои подклассы, использующие контроллер суперкласса с сериализацией/хранением для хранения дополнительных атрибутов. Я добавил в суперкласс методы model_name и self.select_options, а также инициализатор предварительной загрузки из блога Алекса. Я также изменил свой collection_select в помощнике представления _form и проверке атрибутов, чтобы использовать метод self.select_options. Все мои подклассы находятся в отдельных файлах в папке app/models/subfolder, хотя они не имеют пространства имен, как SubFolder::Subclass.

Тогда я начинаю сталкиваться с проблемами. При изменении любого кода self.select_options перестает возвращать все подклассы. Он возвращает только небольшое подмножество или ничего. Таким образом, из-за проверки и привязки _form я не могу редактировать/обновлять свои модели после изменения кода. Из того, что я мог сказать, когда я меняю какой-либо код, Rails перезагружает среду, но не модели в подпапке.

Я попытался добавить маршруты в config.autoload_paths как многие предполагают, но в итоге это не сработало.

Итак, в конечном итоге, я хочу:

  • Что-то, чтобы исправить автозагрузку, чтобы мне не приходилось перезапускать сервер после каждого изменения
  • Базируйте его на подкаталоге, содержащем все дочерние элементы, чтобы избежать ручного обслуживания массива.
  • Рельсы 3.2.11, рубин 1.9.3p125, убунту 12.04.01, рвм

Ответы:


1

В итоге я объединил код из этого ответа и этого один и информацию, почерпнутую из сообщений блога wondible внизу. Казалось, что config.autoload_paths никогда ничему не помогали, но я держал их там. Ключевой частью является инициализатор, которому требуются все файлы в подкаталоге при запуске, а затем при каждой перезагрузке. Я попробовал load вместо require_dependency, но это не сработало. Было определенно приятно, что не нужно перезагружать все время.

В application.rb

config.autoload_paths += %W(#{config.root}/app/models/configuration)

В разработке.рб

config.autoload_paths += Dir["#{config.root}/app/models/configuration/**"]

В preload_sti_models.rb

if Rails.env.development?
  Dir.entries("#{Rails.root}/app/models/subfolder").each do |c|
    require_dependency File.join("app","models", "subfolder", "#{c}") if c =~ /.rb$/
  end
  ActionDispatch::Reloader.to_prepare do
    Dir.entries("#{Rails.root}/app/models/subfolder").each do |c|
      require_dependency File.join("app","models", "subfolder", "#{c}") if c =~ /.rb$/
    end
  end
end

Несколько постов в блоге с полезной информацией

  1. http://wondible.com/2012/01/13/rails-3-2-autoloading-in-theory/
  2. http://wondible.com/2011/12/30/rails-autoloading-cleaning-up-the-mess/
  3. http://wondible.com/2011/12/23/give-rails-autoloading-a-boot-to-the-head/
  4. http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/

Изменить: это известная вещь.

05.02.2013

2

Это решение похоже на решение undefinedvariable выше, но немного более СУХОЕ.

# organize your sti classes in directories named after the parent
sti_directory_paths = [
  Rails.root.join("app","models","subfolder_one"),
  Rails.root.join("app","models","subfolder_two"),
]

def require_sti_model(path, filename)
  require_dependency (path + filename).to_s
end

# if you use something like guard, just exclude from production
unless Rails.env.production?
  sti_directory_paths.each do |sti_directory_path|
    Dir[sti_directory_path + "*.rb"].each do |filename|
      require_sti_model(sti_directory_path, filename)
      ActionDispatch::Reloader.to_prepare do
        require_sti_model(sti_directory_path, filename)
      end
    end
  end
end
11.08.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..