Rails проектная организация со многими моделями - PullRequest
2 голосов
/ 12 февраля 2011

Я работаю над приложением rails, которое начинает иметь то, что кажется (мне) большим количеством моделей. Сейчас их 15, но я подумываю добавить еще 3-4, чтобы они служили в качестве моделей с тегами (мне нужно больше функциональности, чем предлагает Acts As Taggable).

Итак, причина, по которой меня это немного беспокоит, в том, что 7 из 15 моделей принадлежат одному родителю. Некоторые из них принадлежат, а некоторые - has_and_belongs_to_many. Все новые модели, которые я рассматриваю, будут принадлежать одному и тому же родителю.

Итак, что мне интересно, так это лучший "Railsy" способ организации такой ситуации?

Вместо того, чтобы app/models был перегружен 6 "первоклассными" моделями и 10+ детьми одной из них, я должен / могу ли я начать использовать подпапки в папке моего приложения? т.е.: app/models/parent/child.rb?

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

Спасибо!

Ответы [ 2 ]

6 голосов
/ 12 февраля 2011

Вы можете сделать это, я всегда так делаю:)

Просто остерегайтесь чего-нибудь: если вы создадите папку с именем одной из ваших моделей, она потерпит неудачу.На самом деле, Rails подумает, что вы хотите расширить его.

Так что в папке вашей модели добавьте имя вашего класса с любым изобразительным значением.

Пример: если вы хотите связать моделидля пользователей, поместите их в models/user_related/

Вам нужно будет добавить это в ваш application.rb файл:

config.autoload_paths += Dir["#{Rails.root.to_s}/app/models/*"].find_all { |f| File.stat(f).directory? }  

Это будет автоматически загружать все папки, включенные в каталог models.

4 голосов
/ 19 апреля 2012

Я думаю, что ответ апноэ - хороший подход

Основываясь на исследованиях с ActiveSupport 3.0.11, при выборе имени каталога следует соблюдать некоторые правила:

  1. Имя не должно совпадать с константой в вашей системе, иначе может возникнуть ошибка LoadError
  2. Имя должно быть в состоянии преобразовать в допустимое имя константы, иначе произойдет ошибка NameError.

Объяснение проблемы # 1

Пример Apneadiving для имени каталога app / models / user_related работает до тех пор, пока Константа UserRelated никогда не используется в вашем коде. В противном случае ошибка LoadError может потенциально может случиться.

Например, предположим, что была модель с именем UserProfile и впервые rails видит, что константа находится в модуле UserRelated. Rails сначала попытается загрузить константу UserRelated \: \: UserProfile и, если это не так, UserProfile постоянная.

Если файл user_profile находится в app / models / user_related / user_profile.rb, это соответствует подчеркнутому пути UserRelated \: \: UserProfile, и файл будет быть загруженным в ожидании определения константы UserRelated :: UserProfile. это вызовет следующую ошибку, потому что это действительно определяет UserProfile постоянная.

Expected app/models/user_related/user_profile.rb to define UserRelated::UserProfile (LoadError)

Это происходит в коде зависимости активной поддержки.

Объяснение проблемы # 2

Еще одна оговорка: имя каталога должно быть в состоянии превратить в действительный рубин. имя константы (хотя для # 1 константа должна быть неопределенной). За Например, если имя каталога было app / models / user.related, это приведет к в следующей ошибке внутри кода зависимости active_support:

wrong constant name User.related (NameError)
...