Подтвердить что ты не робот

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, мы лучше используем приложение /, чтобы использовать соглашение по конфигурации.

4b9b3361

Ответ 1

По моему опыту, разделение того, где вы помещаете эти модели, сводится к тому, что они функционально представляют в конкретном контексте вашего приложения.

Я обычно резервирую app/models для моделей на основе ресурсов. Если эта модель представляет собой ресурс, который создается и управляется вашим приложением, он идет здесь. Не требуется поддержка AR или db.

Если модель поддерживает согласованную функциональность, но зависит от параметров, я даю им каталог верхнего уровня в приложении. Например, app/mailers app/observers и т.д. Однако, если у вас есть один ресурс, который требует наблюдателя, возможно, нет смысла иметь директорию app/observers с одним файлом в нем.

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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