Rails - куда (каталоги) помещать модели, которые не являются активной записью
Мы создаем приложения, в которых есть Модели, которые не являются компонентами базы данных. Нам любопытно узнать, что делают другие в сообществе рельсов для решения этой проблемы.
Мы боремся с тем, где их поставить.
Должны ли мы иметь:
app/models/domain
или же
app/domain/models
или возможно
app/models # Business Models
app/models/ar # Active Record Models
или возможно
app/models/domain/ # Business Models
app/models/domain/ar # Active Record Models
Частично это связано с тем, что мы боремся с тем, насколько близки стандарты рельсов и сколько нужно создать структуру, которая будет полезна для того, что нам нужно.
Если мы думаем об объектах как об объектах службы, мы могли бы иметь
app/models/service-object
а также
app/models/ # For plain active record
Другой путь, по которому нужно идти, - это не иметь приложения в приложении, например
/service_objects
вместо
/app/models/service_objects
Предположительно, если мы хотим получить доступ через приложение rails, нам лучше использовать app/, чтобы воспользоваться преимуществами соглашения над конфигурацией.
4 ответа
По моему опыту, разделение того, где вы размещаете эти модели, сводится к тому, что они функционально представляют в конкретном контексте вашего приложения.
Я обычно резервирую app/models
для моделей на основе ресурсов. Если эта модель представляет ресурс, который создается вашим приложением и управляется им, он идет сюда. Не нуждается в поддержке AR или DB.
Если модель выполняет согласованную функциональность, но зависит от параметров, я даю им каталог высокого уровня в приложении. Такие как app/mailers
app/observers
и т.д. Однако, если у вас есть один ресурс, который требует наблюдателя, может не иметь смысла иметь app/observers
DIR с одним файлом.
Все остальное идет в lib
, Есть несколько причин, почему это предпочтительнее.
Вы можете выбрать, когда требовать файлы в
lib
, Вы можете быть более избирательными в отношении того, какие файлы загружаются при запуске вашего приложения. Если вы положите все вapp/models
у вас нет детализации того, что загружается.Пространство имен ваших моделей по мере роста вашего приложения легче в lib. Конечно, вы можете пространство имен в
app/models
но несколько слоев вложенности вapp/models
всегда заканчивается противным. Лучше сохранить пространство имен вlib
,Ведение домашнего хозяйства становится намного проще, когда вы располагаете вещи в их функционально правильном месте. Это не ресурс? Это не наблюдатель? Должен быть в
lib
, Вся причина, по которой вы задумываетесь об этом заранее, заключается в том, чтобы обеспечить доступность для разработчиков.
Для сервисных объектов они обычно находятся прямо в каталоге приложения. app/services/
, Рабочие и сериализаторы также следуют этой схеме app/workers/
app/serializers/
, Что касается ваших моделей, которые не являются AR, вы все равно можете вставить их в каталог моделей. Это только мой взгляд на это.
Если они модели, вы должны поместить их в app/models
поскольку этот каталог предназначен для моделей, а не только для подклассов ActiveRecord.
Если у вас есть классы, которые не являются моделями, например, они, возможно, представляют собой форму, я бы сказал: lib
,
Если они ортогональны вашему приложению, т. Е. Это какой-то интерфейс, используемый для вызова другого приложения, вы можете заключить его в частную или общедоступную жемчужину в зависимости от его применимости для остального сообщества.
В конце концов, это не имеет значения. Выберите одну вещь и согласитесь с остальной командой. Перемещение объектов должно быть довольно простым, особенно если вы добавляете все, что вы решите использовать, в путь загрузки для вашего приложения ($LOAD_PATH += '...'
).