Grails中不区分大小写的唯一约束

WaZ*_*WaZ 5 grails grails-orm

我怎样才能基本上对字符串数据类型字段执行唯一约束.

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:我永远不会让用户更改他们的用户名;)

  • 好答案!我认为当"用户名"更新时,自定义验证器可能会出现问题.见http://n4.nabble.com/Case-Insensitive-Constraint-td1359204.html.虽然不确定...... (2认同)