23

这是我想做的:

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

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

所以类 A 应该有一些约束,而 B 应该对相同的属性有相同的附加约束。

我无法让它工作,我可以想象它会与每层次结构表的概念发生冲突。

因此,我尝试通过引入具有 B 类约束的 Command 对象来解决该问题,该约束可以在 B 类的构造函数中进行验证。但是,Command 对象似乎只能在控制器中使用(grails 一直说没有 .validate () 方法)。

所以我的问题是:使用 grails 约束解决这个问题的最优雅的方法是什么(不是手动重新实现验证)?可能...

  • 切换到 Table-per-Sub-Class 概念?
  • 以某种方式使命令对象在域类中工作?
  • 还有什么办法吗?

编辑:我可以在子类中定义所有约束,重复父类的约束,甚至在父类中根本没有约束。但是该解决方案应该适用于同一父类的多个子类(具有不同的约束)。

4

4 回答 4

7

您可以使用

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

正如http://grails.org/doc/latest/ref/Constraints/Usage.html中的状态

于 2014-07-27T07:04:18.763 回答
5

它在 2.x 中的方式:

由于约束是由某些 ConstraintsBuilder 执行的闭包,我会尝试从 B 调用它,比如

class B extends A { 
  static constraints = { 
    url(unique: true)
    A.constraints.delegate = delegate  # thanks Artefacto
    A.constraints()
  } 
}
于 2010-10-22T14:50:36.333 回答
1

基本上我看不出它是如何做到的。

设计明智的领域类实际上映射数据库表的结构。约束实际上会生成数据库约束。因此,您正在尝试制作多个对象,这些对象将在同一张表上生成不同的约束。

我认为更好的方法是创建一个具有最简单约束子集的域对象,然后使用不同的命令对象来微调要传递给域的确切约束。

您还可以使用验证器:在约束中为不同的对象类型微调不同的约束(类似于域中的类型列并基于不同的类型进行不同的验证)。

于 2010-10-22T15:55:22.247 回答
-1

您需要重新声明超类约束,因为它是一个静态 clojure(静态属性和静态方法不被子类继承),因此,它没有被 GORM 映射。

干杯。

于 2011-01-10T12:25:53.657 回答