在约束中导入域

时间:2013-03-12 18:19:06

标签: grails grails-domain-class

我有2个域类

class a {
    String name
    static constraints = {
        name unique:true
    }
}

class b {
    String description
}

在域类b中我想调用类a

import a
class b {
    String description
    static constraints = {
         description unique:'a.name'
    }
}

并收到错误

  

类[b]的属性[描述]的约束[唯一]的范围必须是同一类的有效属性名称

如何从a到b获得属性?

2 个答案:

答案 0 :(得分:1)

您需要编写custom validator来检查唯一性,因为它依赖于比b的单个实例更多的信息。

这样的东西
static constraints {
     description validator: { val ->
         !a.findByName(val)
     }
}

可能会成功。

答案 1 :(得分:1)

假设您尝试在Grails 2 +

中执行此操作

您不能以这种方式使用验证。在您的示例中,您需要引用同一域类的属性。要更正类B中的约束,您可以写:

class B {
    String description
    static contraints = {
        description unique:true
    }
}

但我认为你想从类a中导入约束,这样就完成了。

class B {
    String description
    static contraints = {
        importFrom A
    }
}

请参阅http://grails.org/doc/latest/guide/validation.html#sharingConstraints

这将导入两个类共享的属性的所有约束。在你的情况下,没有。


<强>更新

我得到了一个类似的问题并找到了解决方案。所以我想和你分享一下。 可以使用自定义验证器解决该问题。在您的情况下,类B的约束:

static constraints = {

    description(validator: {
        if (!it) {
            // validates to TRUE if the collection is empty
            // prevents NULL exception
            return true
        }

        def names = A.findAll()*.name
        return names == names.unique()
    })
}

由于要求有点奇怪,很难正确回答你的问题。但也许它会有所帮助。