gpt4 book ai didi

grails - 如何为 Grails 域类中的两个字段创建和 XOR 验证?

转载 作者:行者123 更新时间:2023-12-04 17:38:14 28 4
gpt4 key购买 nike

我有一个问题,我的域类有两个潜在的互斥外部键,序列号或旧查找值。

由于我不确定对于任何给定条目我将拥有哪一个,因此我将它们都设为可空并添加了自定义验证以尝试确保我只有一个值。

package myproject 

class Sample {

String information
String legacyLookup
String serialNumber

static constraints = {
information(nullable: true)
legacyLookup(nullable: true)
serialNumber(nullable: true)

legacyLookup validator: {
return ((serialNumber != null && legacyLookup == null) || (serialNumber == null && legacyLookup != null))
}

serialNumber validator: {
return ((serialNumber != null && legacyLookup == null) || (serialNumber == null && legacyLookup != null))
}
}
}

我创建了默认的 CRUD 屏幕并尝试为这个域类创建一个条目
information: Blah Blah
serialNumber:
legacyLookup: BLAHINDEX123

这在验证器中死亡,并显示以下消息:
No such property: serialNumber for class: myproject.Sample

我错过了什么?

最佳答案

没有必要让每个属性在那里多次;事实上,您只需要其中一个实际上受到约束。此外,您不能仅通过名称直接引用属性。有一些对象被传递到用于获取值的约束闭包(参见 docs )。可能我发现的最简单的方法如下:

class Sample {
String information
String legacyLookup
String serialNumber

static constraints = {
information(nullable: true)
legacyLookup(validator: {val, obj->
if( (!val && !obj.serialNumber) || (val && obj.serialNumber) ) {
return 'must.be.one'
}
})
}
}

然后在 messages.properties 文件中有一个条目,如下所示:
must.be.one=Please enter either a serial number or a legacy id - not both

或者您可以为每个条件提供单独的消息 - 两者都输入,或者两者都是空白,如下所示:
legacyLookup(validator: {val, obj->
if(!val && !obj.serialNumber) {
return 'must.be.one'
}
if(val && obj.serialNumber) {
return 'only.one'
}
})

然后在 message.properties 中有两条消息:
only.one=Don't fill out both
must.be.one=Fill out at least one...

如果没有错误,您不需要从约束中返回任何内容...

关于grails - 如何为 Grails 域类中的两个字段创建和 XOR 验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11481000/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com