возвращать доменные объекты из проверки ограничения Grails - PullRequest
1 голос
/ 28 сентября 2010

Можно ли написать свой собственный валидатор в Grails, который будет возвращать действительный объект?

Что-то вроде:

static constraints = {
    name(validator: {val, obj ->
        if (Drink.findByName(val)) return [Drink.findByName(val)]
    })
}

Другими словами - если напиток уже существует в БДпросто верните существующий, когда кто-нибудь выпьет

новый напиток ("Кокс")

и кокс уже будет в базе данных

Ответы [ 2 ]

2 голосов
/ 28 сентября 2010

Вы не можете сделать это с помощью пользовательского валидатора. Это не совсем то, для чего это было предназначено. Из справочника Grails :

Закрытие может вернуться:

  • null или true, чтобы указать, что значение действительно
  • false, чтобы указать недопустимое значение и использовать код сообщения по умолчанию
  • строка, указывающая код ошибки, добавляемый к «classname.propertName». строка, используемая для разрешения сообщения об ошибке. Если сообщение, специфичное для поля, не может быть разрешено, сам код ошибки будет разрешен с учетом глобальных сообщений об ошибках.
  • список, содержащий строку, как указано выше, а затем любое количество аргументов, следующих за ней, которые можно использовать в качестве аргументов форматированного сообщения, индексированных с 3 и более. См. grails-app/i18n/message.properties, чтобы увидеть, как коды сообщений об ошибках по умолчанию используют аргументы.

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

Возможно, есть более элегантная альтернатива. Несмотря на это, механизм ограничений Grails не способен (и не должен) быть способен на это.

0 голосов
/ 19 августа 2015

Не уверен, что вы можете сделать это изнутри валидатора, но:

Drink d = Drink.findOrSaveWhere (имя: 'Smooth Drink' ,coholLevel: '4.5')

...