Модели пространств имен в приложении Rails - PullRequest
7 голосов
/ 28 марта 2012

У меня недавно была беседа с моим другом, который также является разработчиком RoR.Мы спорили о том, как следует управлять моделями Rails.Лично мне нравится оставлять в пространстве имен по умолчанию только корневые модели (например, User, Article, Bill и т. Д.), А зависимые модели переходят в модуль (например, User :: Profile, User :: Activity) с именем rootмодель, с которой они связаны.

С другой стороны, я видел много проектов, у которых было около 100 моделей в пространстве имен по умолчанию, называемых user_profile, user_activity и так далее.Судя по развитию Java (Spring), сообщество Java имеет тенденцию организовывать классы в пакеты и группировать их логически, что я считаю очень привлекательным.

Итак, вопрос в том, есть ли недостатки в группировании моделей в модулях (кромеextra: class_name в определении отношений) и есть ли какие-то конкретные причины, по которым люди обычно этого не делают?

1 Ответ

4 голосов
/ 28 марта 2012

Хотя пространство имен имеет свои преимущества, оно требует добавления исключений во всех ваших моделях. Foo :: Bar предполагает имя таблицы bars и аналогично bar_id для ассоциаций, тогда как вы можете предпочесть foo_bars и foo_bar_id для использования вместо.

Если вы действительно сильно настроены по этому поводу, вы можете посмотреть, есть ли надстройка, которая исправляет это для вас, или реализовать собственное расширение, которое это делает.

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

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

Контроллеры поддаются группировке вполне естественно, но модели не так легко приспосабливаются, по крайней мере, не со стандартным ActiveRecord.

...