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/mailersapp/observers и т.д. Однако, если у вас есть один ресурс, который требует наблюдателя, может не иметь смысла иметь app/observers DIR с одним файлом.

Все остальное идет в lib, Есть несколько причин, почему это предпочтительнее.

  1. Вы можете выбрать, когда требовать файлы в lib, Вы можете быть более избирательными в отношении того, какие файлы загружаются при запуске вашего приложения. Если вы положите все в app/models у вас нет детализации того, что загружается.

  2. Пространство имен ваших моделей по мере роста вашего приложения легче в lib. Конечно, вы можете пространство имен в app/models но несколько слоев вложенности в app/models всегда заканчивается противным. Лучше сохранить пространство имен в lib,

  3. Ведение домашнего хозяйства становится намного проще, когда вы располагаете вещи в их функционально правильном месте. Это не ресурс? Это не наблюдатель? Должен быть в lib, Вся причина, по которой вы задумываетесь об этом заранее, заключается в том, чтобы обеспечить доступность для разработчиков.

Для сервисных объектов они обычно находятся прямо в каталоге приложения. app/services/, Рабочие и сериализаторы также следуют этой схеме app/workers/app/serializers/, Что касается ваших моделей, которые не являются AR, вы все равно можете вставить их в каталог моделей. Это только мой взгляд на это.

Если они модели, вы должны поместить их в app/models поскольку этот каталог предназначен для моделей, а не только для подклассов ActiveRecord.

Если у вас есть классы, которые не являются моделями, например, они, возможно, представляют собой форму, я бы сказал: lib,

Если они ортогональны вашему приложению, т. Е. Это какой-то интерфейс, используемый для вызова другого приложения, вы можете заключить его в частную или общедоступную жемчужину в зависимости от его применимости для остального сообщества.

В конце концов, это не имеет значения. Выберите одну вещь и согласитесь с остальной командой. Перемещение объектов должно быть довольно простым, особенно если вы добавляете все, что вы решите использовать, в путь загрузки для вашего приложения ($LOAD_PATH += '...').

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