Итак, если вы хотите использовать уникальные имена пользователей без учета регистра, есть два возможных подхода.
Простой:
- Храните их в верхнем или нижнем регистре и используйте уникальное ограничение.
или, что касается производительности, дороже:
- Храните их в смешанном регистре и используйте пользовательский валидатор , который проверяет базу данных путем сравнения заданных и существующих имен пользователей без учета регистра.
Теперь все зависит от того, хотите ли вы предоставить пользователю свободу ввода его имени пользователя в том случае, если он этого хочет (первая возможность), или вы хотите сохранить регистр имен пользователей для отображения причин (вторая возможность).
Ваш вопрос звучит как второй, поэтому пользовательский валидатор будет выглядеть так:
class User {
String username
String email
static hasMany = [roles:Roles]
static constraints = {
email(email:true)
username(validator: {
return !User.findByUsernameILike(it)
})
}
}
Надеюсь, это поможет.
[Изменить]
Как утверждает Генрих в своем комментарии, приведенный выше валидатор вызовет проблемы, когда пользователи смогут изменить свое имя пользователя.
Быстро и грязно, но я думаю, что это решает проблему:
username(validator: { val, obj ->
def similarUser = User.findByUsernameILike(val)
return !similarUser || obj.id == similarUser.id
})
Осторожно, это не проверено, и я не уверен, что вы можете определять переменные в валидаторах.
Мета: я бы никогда не позволил пользователям менять свое имя пользователя;)