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

после работы с ASP.Net MVC, это заставляет меня думать о рельсах. Я работал с Rails до этого, но немного заржавел. ASP.Net учебники MVC рекомендуют скрывать реализацию слоя данных с шаблоном репозитория. Это позволяет инъекции зависимостей easiesr для модульного тестирования и хорошей развязки контроллера от реализации модели.

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

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

5 ответов


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

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

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

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

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


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

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


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

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

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

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


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

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

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


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