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

Пример валидатора по нескольким атрибутам

Валидатор имеет уникальное наименование unique-attributes. Для указания в кастомном валидаторе используется uniqueAttributes.

Настройка валидации в аддоне ember-flexberry версий 3.x.x осуществляется при помощи аддона ember-cp-validations (для версий 2.x.x используется аддон ember-validations). Он не только предоставляет определенный набор готовых валидаторов, но и также позволяет писать кастомные.

Пример настройки валидации уникальности для двух полей text+date в модели ember-flexberry-dummy-suggestion тестового стенда:

// app\models\integration-examples\edit-form\validation\base.js

import DS from 'ember-data';
import EmberFlexberryDataModel from 'ember-flexberry-data/models/model';
import { attr, belongsTo, hasMany } from 'ember-flexberry-data/utils/attributes';
import { validator, buildValidations } from 'ember-cp-validations';

const Validations = buildValidations({
  //...


  text: {
    validators: [
      validator('uniqueAttributes', {
        secondProperty: 'date',
        modelName: 'ember-flexberry-dummy-suggestion',
        view: 'SuggestionL',
        message: 'Combination of attributes (Text, Date) are not unique',
        debounce: 300
      }),
    ],
  },

  //...

});

Свойства валидатора:

  • modelName: Имя модели, в которой будут проверяться атрибуты;
  • view: Представление, по которому будет происходить проверка наличия объекта в хранилище;
  • secondProperty: Дополнительное свойство для проверки уникальности;
  • message: Сообщение валидации;
  • debounce: Задержка в миллисекундах между повторными проверками. Это необходимо, когда есть текстовое поле и пользователь быстро вводит текст. Чтобы не перегружать и не отправлялось множество запросов к хранилищу данных, необходимо указать задержку для проверки валидации.

Если не указывать атрибут modelName, то он автоматически установится в имя модели текущего проверяемого объекта.

Указание modelName добавлено с целью возможности проверять наличие уникальности комбинации полей в другом объекте, отличном от того что редактируется на текущей форме.

Для срабатывания валидатора в примере на тестовом стенде, необходимо добавить строку в таблицу suggestion с необходимыми данными:

INSERT INTO public.suggestion(
	primarykey, 
	createtime, creator, edittime, editor, 
	address, text, 
	date, votes, moderated, 
	type, 
	author, 
	editor1)
	VALUES ('87fe604d-92cd-4cce-896b-e3d62ab566da', 
			NULL, NULL, NULL, NULL, 
			'addr', '12345', 
			TO_DATE('20230703','YYYYMMDD'), 0, false, 
			'1a5a5fcb-2ad1-4554-8fbc-cd33e51308da', 
			'01c157a0-aa74-411d-96d3-8f877dbab853', 
			'01c157a0-aa74-411d-96d3-8f877dbab853');

Когда поменяем текст или дату в нашем примере на те, что нет в хранилище данных, то сообщение валидации исчезает: Валидация прошла

Для проверки значений полей на уникальность используются стандартные возможности хранилища данных.

Пример:

let limitPredicate = new ComplexPredicate(Condition.And,
    new SimplePredicate(attribute, FilterOperator.Eq, value),
    new SimplePredicate(secondProp, FilterOperator.Eq, secondValue));
let builder = new QueryBuilder(thisStore)
    .from(modelName)
    .selectByProjection(options.view)
    .where(limitPredicate);

Вот почему для работы этого валидатора не требуется дополнительных доработок со стороны бекенда.

Перейти