Как добавить ограничения на унаследованные свойства в подклассе домена grails - PullRequest
22 голосов
/ 14 октября 2010

Вот что я хотел бы сделать:

class A {
  String string
  static constraints = {
    string(maxSize:100)
  }
}

class B extends A {
  static constraints = {
    string(url:true)
  }
}

Таким образом, класс A должен иметь некоторые ограничения, а B должен иметь то же самое плюс дополнительные ограничения на то же свойство.

Хотя я не мог заставить это работать, и я могу представить, что это вступит в противоречие с концепцией «Таблица на иерархию».

Поэтому я попытался обойти эту проблему, введя объект Command с ограничениями класса B, которые можно проверить в конструкторе класса B. Однако кажется, что объекты Command можно использовать только внутри контроллеров (grails продолжает говорить, что существует для него нет метода .validate ()).

Итак, мой вопрос: каков наиболее элегантный способ решить эту проблему, используя ограничения Grails (без повторной реализации проверки вручную)? Может быть ...

  • Переключение на концепцию «Таблица на подкласс»?
  • Как заставить объект Command работать в классе Domain как-нибудь?
  • Любой другой способ?

Редактировать: Было бы хорошо, если бы я определил все ограничения в дочерних классах, повторяя ограничения родительского класса или вообще не имея ограничений в родительском классе. Но решение должно работать для нескольких дочерних классов (с различными ограничениями) одного и того же родительского класса.

Ответы [ 4 ]

7 голосов
/ 27 июля 2014

Вы можете использовать

    class B extends A {
       static constraints = {
          importFrom A
          //B stuff
       }
    }

как указано в http://grails.org/doc/latest/ref/Constraints/Usage.html

5 голосов
/ 22 октября 2010

Как это было в 2.x:

Поскольку ограничения - это замыкания, выполняемые некоторыми ConstraintsBuilder, я бы попытался вызвать его из B, как

class B extends A { 
  static constraints = { 
    url(unique: true)
    A.constraints.delegate = delegate  # thanks Artefacto
    A.constraints()
  } 
}
1 голос
/ 22 октября 2010

В принципе я не вижу, как это можно сделать.

Проектирование класса домена фактически отображает структуру таблицы базы данных. Ограничения будут фактически генерировать ограничения БД. Итак, вы пытаетесь создать несколько объектов, которые будут генерировать различные ограничения для одной и той же таблицы.

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

Вы также можете использовать валидатор: в ограничениях для точной настройки различных ограничений для разных типов объектов (что-то вроде столбца типов в домене и на основе разных типов выполняет разную проверку).

0 голосов
/ 10 января 2011

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

Приветствие.

...