如何在grails域子类中添加对继承属性的约束

时间:2010-10-14 14:22:41

标签: inheritance grails constraints subclass command-objects

这是我想做的事情:

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

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

所以A类应该有一些约束,B应该在同一个属性上有相同的加上约束。

我无法让它工作,我可以想象它会与Table-per-Hierarchy概念发生冲突。

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

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

  • 切换到每子类表概念?
  • 以某种方式使命令对象在Domain类中工作?
  • 还有其他方式吗?

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

4 个答案:

答案 0 :(得分:7)

您可以使用

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

作为http://grails.org/doc/latest/ref/Constraints/Usage.html

中的状态

答案 1 :(得分:5)

它在2.x中的方式:

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

class B extends A { 
  static constraints = { 
    url(unique: true)
    A.constraints.delegate = delegate  # thanks Artefacto
    A.constraints()
  } 
}

答案 2 :(得分:1)

基本上我看不出它是怎么做的。

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

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

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

答案 3 :(得分:-1)

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

干杯。