До Rails 6 существовал простой способ разбить любой класс Ruby на несколько файлов, не вводя никаких дополнительных модулей или проблем. Это было очень полезно для тех классов Бога, которые оказались слишком большими, чтобы их можно было хранить в одном файле:
# god.rb
class God < ApplicationRecord
require_dependency 'god~callbacks'
require_dependency 'god~scopes'
require_dependency 'god~search'
require_dependency 'god~something_else'
require_dependency 'god~and_more'
require_dependency 'god~and_even_more'
...
end
# god~callbacks.rb
class God
before_save :nullify_blanks
before_save :nullify_unrelated_attrs
...
end
, и структура файла выглядела так:
models/
god.rb
god~callbacks.rb
god~scopes.rb
god~search.rb
...
И это прекрасно работает - каждый раз, когда вы что-либо изменяете в любом из этих файлов, изменения корректно перезагружаются.
Начиная с Rails 6, используется новый загрузчик классов - Zeitwerk. И это здорово, но кажется, что он не работает с require_dependency
, по крайней мере, когда этот метод используется таким нестандартным способом.
Таким образом, вопрос в том, возможно ли разделить определение классав несколько файлов и продолжайте автоматическую перезагрузку, работая с Zeitwerk. И цель состоит в том, чтобы разделить класс без введения каких-либо внутренних модулей / проблем.
И, пожалуйста, не нужно комментировать, является ли класс длиной в 1000 строк хорошей практикой проектирования или нет, вопрос не в этом.