域列表上的 Grails 唯一约束
Grails unique constraint on Domain list
如果我有一个域 Person 和一个 Domain Hobby,并且 Person hasMany Hobby,我如何才能确保相同的 Hobby 不会多次添加到 Person 集合中。
即像
`
class Hobby {
String name
static belongsTo = [person: Person]
}
class Person
String name
static hasMany =[hobby: Hobby]
static constraints= {
hobby.name unique: true //like this
}
}
这是自定义 validator
的完美用例。我建议阅读 documentation 以便您了解其中的可能性,但您可以使用如下内容:
class Hobby {
String name
static belongsTo = [person: Person]
}
class Person
String name
static hasMany = [hobby: Hobby]
static constraints = {
hobby validator: { val, obj ->
if (obj.hobby.find{ (it.name.equals(val.name) && it.id != val.id) } ) return ['unique']
}
}
}
以上只是我的一些想法,可能会有拼写错误或逻辑错误,但它是一个示例,说明如何使用自定义 validator
.
更新
Gregg 关于使 Hobby
每个 Person
唯一的答案实际上是解决此问题的一种更简单、更清晰的方法。正如他指出的那样,实际上不需要自定义验证器,因为 Person
和 Hobby
之间存在关系。
文档 (http://docs.grails.org/2.5.5/guide/GORM.html#sets,ListsAndMaps) 说用 hasMany
定义的集合是 java.util.Set
。并且 Set
不能包含重复项。
所以我认为您不必定义约束,默认情况下您有请求的行为。
我知道这个问题已经得到解答,但最简单的方法确实是这样做:
class Hobby {
String name
static belongsTo = [person: Person]
static constraints = {
name unique: 'person'
}
}
这将确保 hobby
对其父项 person
具有唯一的名称。无需自定义验证器。
如果我有一个域 Person 和一个 Domain Hobby,并且 Person hasMany Hobby,我如何才能确保相同的 Hobby 不会多次添加到 Person 集合中。
即像
`
class Hobby {
String name
static belongsTo = [person: Person]
}
class Person
String name
static hasMany =[hobby: Hobby]
static constraints= {
hobby.name unique: true //like this
}
}
这是自定义 validator
的完美用例。我建议阅读 documentation 以便您了解其中的可能性,但您可以使用如下内容:
class Hobby {
String name
static belongsTo = [person: Person]
}
class Person
String name
static hasMany = [hobby: Hobby]
static constraints = {
hobby validator: { val, obj ->
if (obj.hobby.find{ (it.name.equals(val.name) && it.id != val.id) } ) return ['unique']
}
}
}
以上只是我的一些想法,可能会有拼写错误或逻辑错误,但它是一个示例,说明如何使用自定义 validator
.
更新
Gregg 关于使 Hobby
每个 Person
唯一的答案实际上是解决此问题的一种更简单、更清晰的方法。正如他指出的那样,实际上不需要自定义验证器,因为 Person
和 Hobby
之间存在关系。
文档 (http://docs.grails.org/2.5.5/guide/GORM.html#sets,ListsAndMaps) 说用 hasMany
定义的集合是 java.util.Set
。并且 Set
不能包含重复项。
所以我认为您不必定义约束,默认情况下您有请求的行为。
我知道这个问题已经得到解答,但最简单的方法确实是这样做:
class Hobby {
String name
static belongsTo = [person: Person]
static constraints = {
name unique: 'person'
}
}
这将确保 hobby
对其父项 person
具有唯一的名称。无需自定义验证器。