Как разбить файл модели Rails на несколько файлов (не проблемы, не модули, а просто отдельные файлы)?

У меня есть модель Foo для Rails 4, определенная в одном файле foo.rb

# app/models/foo.rb
class Foo < ActiveRecord::Base
  def method1
    ...
  end

  def method2
    ...
  end
end

Без какого-либо переопределения класса (например, без рефакторинга для использования свойств или проблем), я хотел бы просто переехать часть кода в новый файл, foo_more.rb

# app/models/foo.rb
require File.expand_path('../foo_more.rb', __FILE__)
class Foo < ActiveRecord::Base
  def method1
    ...
  end
end

# app/models/foo_more.rb
class Foo < ActiveRecord::Base
  def method2
    ...
  end
end

Когда я делаю это, используя требование, он работает, НО не перезагружается в dev't после изменений кода в этом файле.

Есть ли способ сказать Rails повторно загрузить этот новый файл в процессе разработки после изменения кода?

Причиной является временная песочница. Я хочу передать несколько десятков методов другому разработчику для проверки и рефакторинга, чтобы они не копались в исходном файле основной модели одновременно с другим разработчиком, добавляющим новую (но не связанную) функциональность.

jpw 09.04.2019 05:26

Это не приглашение для обзора кода, @jvillian, мой вопрос четко и лаконично излагает, что я хочу сделать. И сделали, хотя и не с возможностью автоматической перезагрузки после изменения кода, как я бы предпочел.

jpw 09.04.2019 07:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
426
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
require_dependency File.expand_path('../foo_more.rb', __FILE__)
class Foo < ActiveRecord::Base
  def method1
    ...
  end
end

# app/models/foo_more.rb
class Foo < ActiveRecord::Base
  def method2
    ...
  end
end

require_dependency(file_name, message = "No such file to load -- %s")

Interprets a file using mechanism and marks its defined constants as autoloaded. file_name can be either a string or respond to to_path.

Common Usage:

Use this method in code that absolutely needs a certain constant to be defined at that point. A typical use case is to make constant name resolution deterministic for constants with the same relative name in different namespaces whose evaluation would depend on load order otherwise.

I typically use require_dependency when developing a class or module that resides in my rails app, perhaps in the lib/ dir. A normal require statement does not reload my changes, so I use require_dependency in files that reference my newly developed class or module.

Источник

Следует отметить, что ваши мили могут отличаться. Некоторые люди испытывают серьезные замедления при включении новой зависимости. Я считаю, что это будет перезагружать файл каждый раз, когда вы вызываете Foo.all, Foo.find(1) и т. д. Так что, вероятно, вам следует делать это только в процессе разработки.

Большое спасибо за подробный ответ. Кстати, отличное имя пользователя! Мой любимый тупой сериал, жаль, что их мало!

jpw 09.04.2019 20:19

Другие вопросы по теме