Где проводить проверки после разработки DCI?
============================================

Я следую за DCI, чтобы структурировать поведение нового Rails-приложения, но у меня есть некоторые сомнения относительно того, где поставить проверки.

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

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

Считаете ли вы хорошей идеей сохранить эти валидации в ролях? Если да, то как вы объявляете их, не загрязняя другие экземпляры того же класса, кроме объекта? Если я хочу использовать проверки ActiveRecord, они объявляются на уровне класса, поэтому я не могу присоединить их к объекту индивидуально, вынуждая использовать повторное объявление метода проверки "validate" в модуле роли (прикрепление ошибки в массив ошибок объекта непосредственно) или какой-либо подобный метод.

 

Это зависит от рассматриваемых валидаций/правил.
Основной целью DCI является разделение того, что система (модель домена) от того, что делает система (функциональность), если правила связаны с моделью домена. Например. правила для приветствия SSN, тогда он должен быть частью объектов данных. С другой стороны, если правила связаны с функциональными возможностями системы. пользователю разрешено заказывать только два супердепозитных продукта каждую неделю, то это вопрос для контекста

 (function(w, d, n, s, t) {
 w[n] = w[n] || [];
 w[n].push(function() {
 Ya.Context.AdvManager.render({
 blockId: "R-A-248011-3",
 renderTo: "yandex\_rtb\_R-A-248011-3",
 async: true
 });
 });
 t = d.getElementsByTagName("script")[0];
 s = d.createElement("script");
 s.src = "//an.yandex.ru/system/context.js";
 s.async = true;
 t.parentNode.insertBefore(s, t);
 })(this, this.document, "yandexContextAsyncCallbacks");