[Адаптировано из части this answer к более общему вопросу]
В простом приложении Rails, классы модели приложения определены в его каталоге app/models
с путем к файлу, который может быть получен детерминировано от имени класса , Способ, чтобы получить этот путь может быть определен в конкретной модели класса MyModel
так:
class MyModel
def self.file_path
Rails.root.join('app', 'models', "#{klass.name.underscore}.rb").to_s
end
end
Например, эта конкретная модель класса MyModel
будет определен в APP_ROOT/app/models/my_model.rb
, где APP_ROOT
является путь к корневой директории приложения.
Чтобы обобщить это, можно определить такой метод во всех классах моделей и рассмотреть расширения простой конфигурации путей Rails. В приложении Rails, которое определяет пользовательские пути для определений моделей, необходимо учитывать все из них. Кроме того, поскольку произвольный класс модели может быть определен в любом Rails-модуле, загруженном приложением, необходимо также посмотреть во всех загруженных двигателях, учитывая их собственные пути. Следующий код объединяет эти соображения.
module ActiveRecord
class Base
def self.file_path
candidates = Rails.application.config.paths['app/models'].map do |model_root|
Rails.root.join(model_root, "#{name.underscore}.rb").to_s
end
candidates += Rails::Engine::Railties.engines.flat_map do |engine|
engine.paths['app/models'].map do |model_root|
engine.root.join(model_root, "#{name.underscore}.rb").to_s
end
end
candidates.find { |path| File.exist?(path) }
end
end
end
Чтобы сделать Rails применить эту обезьяну патч, require
это в config/initializers/active_record.rb
.
Это работает для моделей в подпапках? –
Да, я знаю этот путь, но я надеялся, что он уже реализован в рельсах – maki
@LeviStanley, теперь он должен работать. –