2012-03-28 3 views
7

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

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

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

ответ

4

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

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

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

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

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

+2

Я не помню, когда я в последний раз открывал базу данных. С рубином это естественно, чтобы абстрагировать такие вещи. Насколько я помню, Foo :: Bar создаст таблицу «foo_bar». Единственный недостаток заключается в том, что вам необходимо указать: class_name => Foo :: Bar в ассоциациях. Интересно, как приложение rails должно обрабатывать сложное приложение, если оно поддерживает сохранение всех моделей в одном каталоге. Я имею в виду, что если приложение слишком сильно растет, это означает, что пространство имен требуется для частичного рефакторинга или просто переключается на Java?) – FreeCandies

+6

Обычно я использую префикс как своего рода пространство имен, поэтому вы создаете такие вещи, как UserProfile и UserActivity вместо профиля или активности. Это приводит к естественной группировке в листинге. Редко можно увидеть приложение с более 500 моделями, которые значительно выиграли бы от пространства имен. Сложно сложно. Иногда лучше быть честным о том, насколько сложным является ваше приложение, чем пытаться притворяться, что на самом деле это просто, похоронив сложность и просто усложняя поиск вещей. – tadman