Ruby on Rails с шаблоном репозитория?

После работы с ASP.Net MVC у меня есть вопрос о Rails. Раньше я работал с Rails, но немного ржавый. ASP.Net MVC tutorials recomment скрывает реализацию уровня данных с шаблоном репозитория. Это позволяет easiesr Injection Dependency для Unit Testing, а также отличную развязку контроллера от реализации модели.

Я помню контроллеры Rails напрямую, используя объекты Active Record, и модульные тесты с использованием тестовых баз данных, которые можно было легко настроить и снести. Это решает необходимость поменять местами для модульного тестирования, но все же кажется, что плохая идея иметь так много кода ActiveRecord, открытого в контроллере.

Итак, мой вопрос в том, что является последней лучшей практикой здесь? Являются ли настоящие (не издевательства) базы данных, все еще используемые для модульного тестирования? Разве Rails-разработчики напрямую называют ActiveRecord или абстракцией?

Ответы

Ответ 1

Действительно ли ActiveRecord действительно представляет собой "слой данных"? В конце концов, его целью является абстрактное (в довольно разумной степени) фактическое хранилище взаимодействия. Если у меня есть модель, которая наследует от ActiveRecord::Base, и я ссылаюсь на эту модель в контроллере, я действительно взаимодействую с уровнем данных?

Глядя на краткое описание шаблон хранилища, я бы сказал, что методы find_by_ уже дают вам многое из того, что он описывает, что хорошо, не так ли? Хорошо, слой абстракции негерметичен (можно было бы более щедро сказать "прагматичный" ) в том, что при необходимости мы можем приблизиться к металлу, и find_by_sql, например, в значительной степени сделает очевидным, что мы имеем дело с реляционная база данных.

Я бы рекомендовал никогда (или, может быть, я должен сказать "редко и не без особого оправдания" - это всегда сложно использовать абсолюты), вставляя код в контроллеры, что позволяет сделать вывод о том, что используемая платформа данных. Все это должно быть перенесено в модели - named_scope может быть очень полезно здесь. Для сложных результатов рассмотрите использование объектов "представления", поскольку интерфейс (Struct и мой личный любимый OpenStruct может быть очень полезен здесь).

Хотя ActiveRecord является стандартом де-факто, учитывая, что он устанавливает с Rails, это не единственная игра в городе. Для баз данных, отличных от SQL, необходимо что-то другое, но даже в домене SQL есть Datamapper (это на основе одноименного шаблона PoEAA)

В Rails 3.0 будет намного легче выбрать и выбрать компоненты, такие как ORM как Yehuda, и мальчики разблокируют и очищают интерфейсы.

Ответ 2

Мой опыт в том, что Ruby on Rails так сильно интегрирует ActiveRecord (в большинстве случаев он может стать почти полностью прозрачным), который разработчики часто используют без абстракции.

Следует помнить, что шаблон репозитория и шаблон активной записи были предложены в "Шаблоны архитектуры предприятия" Мартина Фаулера (который, если вы еще не прочитали его... вы должны). Активная запись плотно интегрирована в Rails. Microsoft.NET не привязывает вас к шаблону... так что шаблон репозитория был принят большинством разработчиков.

Ответ 3

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

Но это не редкость издеваться над вызовами уровня сервиса, например:

User.expects(:find_by_id).with("1").returns(u);
get :show, :id=>"1"

... или что-то в этом роде. Фактически, я все это время контролирую объект модели (или издеваюсь над этим).

Ответ 4

Соглашения Folllowing Rails всегда ведут вниз по пути наименее болезненных воспоминаний, поэтому рекомендуется.

В зависимости от вашего определения "реальный"... Для модульного тестирования я видел, что люди склонны использовать одну и ту же схему данных в качестве своего основного сайта и засеять базу данных до запуска тестов/во время тестов (по используя инструменты Factory Girl, Machinist или plain ol '), а затем тесты выполняются на основе этих данных.

Разработчики Rails называют ActiveRecord непосредственно этими данными, как в реальном мире.

Ответ 5

Контроллеры должны получать доступ к моделям в MVC. Rails - это все, что позволяет избежать некоторых ненужных абстракций, которые характеризуют мир предприятия.