Нечувствительное к регистру ограничение на уникальность данных в Grails

Как я могу в основном выполнить ограничение на уникальность данных на поле типа данных String.

class User{
  String username
  String Email

  static hasMany = [roles:Roles]

     static constraints = {
     Email(email:true)
     username(unique:true)

    }
}

Есть ли любой простой способ реализовать username(unique: true)

Или я должен вручную проверить методы использования базы данных как .findByNameLike?

Имя пользователя должно быть уникальным, но уникальность, должно быть нечувствительным к регистру.

5
задан Rob Hruska 23 March 2012 в 12:40
поделиться

2 ответа

Итак, если вы хотите иметь уникальные и нечувствительные к регистру имена пользователей, есть два возможных подхода.

Самый простой:

  • Сохраните их в верхнем или нижнем регистре и используйте ограничение уникальности.

или, что касается производительности, дороже:

  • Храните их в смешанном регистре и используйте настраиваемый валидатор , который проверяет базу данных, сравнивая данные и существующие имена пользователей без учета регистра.

Теперь это зависит от того, хотите ли вы просто дать пользователю свободу вводить свое имя пользователя в случае, если он хочет (первая возможность), или вы хотите сохранить регистр имен пользователей для отображения причин (вторая возможность).

Ваш вопрос звучит как второй, поэтому пользовательский валидатор будет выглядеть так:

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
                    })

Остерегайтесь, это не проверено, и я не уверен, что вы можете определять переменные в валидаторах.

Мета: я бы никогда не позволил пользователям менять свое имя пользователя;)

13
ответ дан 18 December 2019 в 10:43
поделиться

username(unique:true) является допустимым ограничением.

Чтобы сделать ограничение нечувствительным к регистру, вам нужно написать собственный валидатор. Дополнительную информацию см. в этой ветке обсуждения.

1
ответ дан 18 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: