Вопрос

В руководствах RoR для работы ORM указывается по одной модели на таблицу.Моя схема БД содержит около 70 таблиц, концептуально разделенных на 5 функциональных групп (например, любая данная таблица находится в одной и только одной функциональной группе, а связи между таблицами разных групп сведены к минимуму.) Итак:должен ли я разработать модель для каждой концептуальной группы, или я должен просто иметь 70 моделей Rails и оставить группировку "концептуальной"?Спасибо!

Это было полезно?

Решение

Я описываю это в одном из моих больших приложений, просто убедившись, что таблицы / модели концептуально сгруппированы по названию (с соотношением таблица-модель почти 1: 1).Пример:

events
event_types
event_groups
event_attendees
etc...

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

Другие советы

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

Вам определенно следует использовать по одной модели для каждой таблицы, чтобы воспользоваться всеми преимуществами магии ActiveRecord.

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

Например, вы могли бы иметь:

app/models/admin/user.rb
app/models/admin/group.rb

для моделей Admin::User и Admin::Group, а также

app/models/publishing/article.rb
app/models/publishing/comment.rb

для публикации::Статьи и публикации::Комментария

И так далее...

Не зная более подробной информации о природе семидесяти таблиц и их концептуальных связях, на самом деле невозможно дать хороший ответ.Это устаревшие таблицы или вы разработали их с нуля?

Связаны ли таблицы каким-то шаблоном наследования или это может быть так?Rails может выполнять ограниченную форму наследования.Найдите Наследование одной таблицы (STI).

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

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

Будет ли каждая из ваших таблиц рассматриваться как "объект", например таблица "автомобили", или некоторые таблицы содержат только информацию о взаимоотношениях, например, все столбцы внешнего ключа?

В Rails моделями становятся только таблицы "объектов"!(С некоторым исключением для определенных типов ассоциаций) Таким образом, весьма вероятно, что если у вас есть только 5 функциональных групп, у вас может не быть 70 моделей.Кроме того, если упомянутые вами группы функций сильно отличаются, они могут даже лучше всего подойти в своем собственном приложении.

Может быть небольшое количество случаев, когда вы можете использовать стандартную модель Rails с одной таблицей наследования.Возможно, все классы в одной конкретной функциональной группе имеют одинаковые поля (или почти все одинаковые).В таком случае воспользуйтесь преимуществами сухости, которые предлагает STI.Однако, когда это не имеет смысла, используйте class-per-table .

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

app/models/admin/base.rb - module Admin::Base, included by all other Admin::xxx
app/models/admin/user.rb - class Admin::User, includes Admin::Base
app/models/admin/group.rb - class Admin::Group, includes Admin::Base

Как уже упоминалось, трудно дать достойный совет, не зная схемы вашей базы данных и т.д., Однако я бы склонялся к созданию более 70 моделей (по одной для каждой из ваших таблиц).

Возможно, вам сойдет с рук отказ от какой-то модели, но за меньшую стоимость (незначительную) вы с таким же успехом можете иметь их там.

Вам не нужно создавать контроллер + представления для каждой модели (как ответил srboisvert).Вам нужен только контроллер для каждого ресурса (которого, я бы ожидал, будет намного меньше 70 - вероятно, всего 10 или 15 или около того, судя по вашему описанию).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top