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