2013-05-09 3 views
18

Мы создаем приложения, в которых есть модели, которые не являются компонентами базы данных. Нам любопытно узнать, что делают другие в сообществе рельсов, чтобы решить эту тему.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 

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

+5

Этот каталог называется «модели». Он не называется только «потомками active_record». Я просто собрал их и набросал монгольские модели :) –

+0

Вы можете разместить их под 'lib', если вы действительно хотите придерживаться AR-only только в моделях – Raindal

+1

Я бы пересмотрел их в lib, но его вариант , Мне нравится вставлять файлы в lib, что я считаю хорошими кандидатами для извлечения в драгоценные камни для повторного использования. –

ответ

12

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

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

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

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

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

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

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

14

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

+0

+1 Это полезно, спасибо. Мы немного обеспокоены тем, что по мере того, как приложение растет, мы можем в итоге включить 34 модели Active Record и 12 неактивных записей, а затем модели будут иметь mish-mash из 46 вместе. Это может быть хорошо, мы просто задаемся вопросом об этом потенциальном будущем. –

+2

Согласитесь с этим - в определенный момент, если у вас есть стабильные модели, отличные от AR, которые вписываются в определенные функции, вы всегда можете извлечь их в модули. – mikeryz

+0

Ну, это также сводится к разделению проблем приложениями. Вы не хотите, чтобы одно приложение становилось настолько большим, что вы не можете управлять им. Например, когда приложение становится слишком большим, я бы подумал о том, чтобы отделить auth в своем собственном приложении и следовать этому шаблону, а затем просто общаться через API. –

1

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

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

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

9

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

+0

это хорошо работает, я делаю это с рельсами 5 –