Grails动态“inList”

时间:2018-03-29 13:24:23

标签: grails grails3

这几乎与这个古老的问题完全相同:Dynamic define the inList constraint using database query基本上没有得到解决,也许自从被问到这些年以来已经取得了进展。

我想使用来自其他域的值填充域属性的inList参数。由于自动生成的视图(scaffolding,filterpane),这需要来自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的实例而不破坏拥有域的已保存值...具有已删除值的域将在以后无效,并且必须在保存之前进行更新,但是已归档/锁定记录仍然存在并可以显示。

1 个答案:

答案 0 :(得分:1)

您可以为filterpane指定值列表,如下所示:

<filterpane:filterPane domain="MyObject" filterPropertyValues="${['someValue':[values: SomeOtherDomain.list().collect{it.name}]]}" />

然后只需使用自定义验证器进行实际验证。我不确定什么脚手架可能会使用inList,但如果你能用静态替换一些脚手架页面就可以轻松解决这个问题。