2012-04-26 4 views
5

В довольно большом проекте я столкнулся с проблемой глубокой вложенности моделей. Например, существует модель, как это:Глубокая вложенность модели в Ruby on Rails

class Communication::Conversation::ForProposal < Communication::Conversation::Base 
    ... 
end 

и, кроме того, каждый раз, когда нам нужно указать table_name, class_name, foreign_keys и так далее.

Какие альтернативы вы знаете и как на самом деле на ваш взгляд следует назвать модели?

+1

Не используйте пространства имен. –

+0

@Beerlington вообще? Иногда это имеет смысл. Например, если у вас есть какая-то подсистема в проекте, состоящая из нескольких моделей, работающих вместе. –

+0

У меня был диалог с моими друзьями, поэтому мы пришли к выводу, что вложение круто для моделей STI и для контроллеров, для разделения частей Admin :: и пользователей. Что-нибудь еще? – makaroni4

ответ

0

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

http://juixe.com/techknow/index.php/2006/06/15/mixins-in-ruby/

Я смотрел на некоторый исходный код Rails на GitHub, и это очень чистый. Они сильно используют миксины.

https://github.com/rails/rails/tree/master/activemodel/lib

+0

Использование mixins не объединяет модели вместе. У меня есть дополнительные подключения к другим базам данных (хотя это переходная мера), и некоторые из баз данных имеют одинаковые имена таблиц, поэтому пространство имен также распространяется на столбцы имен, для которых mixins не помогают. –

+0

Я вижу в документации утилиты REXML пример выполнения REXML, а затем не должен квалифицировать пространство имен. http://www.germane-software.com/software/rexml/docs/tutorial.html –

0

В последних версии рельсов вы можете переместить ваши модели, помещая их в каталоге под приложением/модели. Вы можете попробовать приложение/модели/связь/разговор для этих моделей.

+0

Это не относится к вопросу о необходимости указывать пространство имен при использовании моделей. –

+0

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