这几乎与这个古老的问题相同:Dynamic define the inList constraint using database query基本上没有得到解决,自提出该问题以来,也许几年来有所进步。
我想用来自另一个域的值填充域属性的inList
参数。由于自动生成的 View (脚手架,滤镜),这需要来自inList
而不是自定义验证器。
class MyDomain {
String someValue
static constraints = {
someValue(nullable: true, maxSize: 50, inList: SomeOtherDomain.list()*.name)
}
}
这在启动时给出以下错误:
Caused by: java.lang.IllegalStateException: Either class [thepackage.SomeOtherDomain] is not a domain class or GORM has not been initialized correctly or has already been shutdown. Ensure GORM is loaded and configured correctly before calling any methods on a GORM entity.
我知道,处理此问题的“正确”方法是使
someValue
成为SomeOtherDomain
的实例,而不是仅仅存储名称,但这并不完全适合。我们希望能够删除SomeOtherDomain
实例而不破坏拥有域的保存值...具有删除值的域将继续无效,并且必须在保存之前进行更新,但已归档/锁定的记录将仍然存在并可以显示。 最佳答案
您可以像这样为filterpane指定值列表:
<filterpane:filterPane domain="MyObject" filterPropertyValues="${['someValue':[values: SomeOtherDomain.list().collect{it.name}]]}" />
然后,只需使用自定义验证程序即可进行实际验证。我不确定哪种脚手架可以使用inList,但是如果可以,可以用静态页面替换一些脚手架页面,这样很容易解决。