我怎样才能基本上对字符串数据类型字段执行唯一约束.
class User{
String username
String Email
static hasMany = [roles:Roles]
static constraints = {
Email(email:true)
username(unique:true)
}
}
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来实现 username(unique: true)
或者我必须使用类似的方法手动检查数据库.findByNameLike吗?
用户名应该是唯一的,但唯一性应该不区分大小写.
cod*_*orn 13
因此,如果您希望拥有唯一且不区分大小写的用户名,则有两种可能的方法.
简单的一个:
或者,关于性能,更昂贵:
现在它取决于,如果你只是想让用户自由地输入他想要的用户名(第一种可能性),或者你想保留用户名案例以显示原因(第二种可能性).
你的问题听起来像第二个,所以自定义验证器看起来像这样:
class User {
String username
String email
static hasMany = [roles:Roles]
static constraints = {
email(email:true)
username(validator: {
return !User.findByUsernameILike(it)
})
}
}
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
[编辑]
正如海因里希在评论中所述,当用户能够更改用户名时,上述验证器将导致问题.
快速而肮脏,但我认为这解决了这个问题:
username(validator: { val, obj ->
def similarUser = User.findByUsernameILike(val)
return !similarUser || obj.id == similarUser.id
})
Run Code Online (Sandbox Code Playgroud)
请注意,它没有经过测试,我不确定您是否能够在验证器中定义变量.
Meta:我永远不会让用户更改他们的用户名;)
| 归档时间: |
|
| 查看次数: |
4927 次 |
| 最近记录: |