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

C++, 15 строк:

#include <string>
using namespace std;

string Thousands[] = { "zero", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sexillion", "septillion", "octillion", "nonillion", "decillion" };
string Ones[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
string Tens[] = { "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };
string concat(bool cond1, string first, bool cond2, string second) { return (cond1 ? first : "") + (cond1 && cond2 ? " " : "") + (cond2 ? second : ""); }

string toStringBelowThousand(unsigned long long n) {
  return concat(n >= 100, Ones[n / 100] + " hundred", n % 100 != 0, (n % 100 < 20 ? Ones[n % 100] : Tens[(n % 100) / 10] + (n % 10 > 0 ? " " + Ones[n % 10] : "")));
}

string toString(unsigned long long n, int push = 0) {
  return n == 0 ? "zero" : concat(n >= 1000, toString(n / 1000, push + 1), n % 1000 != 0, concat(true, toStringBelowThousand(n % 1000), push > 0, Thousands[push]));
}

Использование:

cout << toString(51351);   // => fifty one thousand three hundred fifty one
13
задан John Topley 4 November 2009 в 10:21
поделиться

5 ответов

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

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

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

В то время как ActiveRecord - это de facto стандарт, учитывая, что он устанавливается с Rails, это не единственная игра в городе. Для баз данных, отличных от SQL, необходимо что-то другое, но даже в домене SQL есть '

7
ответ дан 1 December 2019 в 23:31
поделиться

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

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

9
ответ дан 1 December 2019 в 23:31
поделиться

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

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

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

0
ответ дан 1 December 2019 в 23:31
поделиться

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

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

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

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

2
ответ дан 1 December 2019 в 23:31
поделиться

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

0
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: