Генерация уникальной случайной строки для идентификации записи - PullRequest
10 голосов
/ 29 ноября 2009

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

В настоящее время у меня есть поле первичного ключа, и сгенерированные маршруты выглядят так:

/users/1

Тем не менее, я хотел бы иметь возможность генерировать маршрут как:

/users/kfjslncdk

Я могу соединить все на стороне маршрута, на стороне базы данных и т. Д., Но я не уверен, что лучший способ для генерации уникального идентификатора строки был бы в рельсах. Я хотел бы сделать что-то вроде:

before_save :create_unique_identifier

def create_unique_identifier
    self.unique_identifier = ... magic goes here ...
end

Я думал, что смогу использовать первую часть guid, созданного с помощью UUIDTools, но мне нужно проверить, чтобы убедиться, что он уникален, прежде чем сохранять пользователя.

Любой совет будет принята с благодарностью!

Ответы [ 4 ]

46 голосов
/ 12 ноября 2012
before_create :create_unique_identifier

def create_unique_identifier
  loop do
    self. unique_identifier = SecureRandom.hex(5) # or whatever you chose like UUID tools
    break unless self.class.exists?(:unique_identifier => unique_identifier)
  end
end
8 голосов
/ 12 ноября 2012

Ruby 1.9 включает встроенный генератор UUID: SecureRandom.uuid

4 голосов
3 голосов
/ 12 ноября 2012

Избавьте себя от необходимости хранить запутанный идентификатор и просто закодируйте идентификатор с помощью базы 62 (a-z, A-Z, 0-9), но пользовательский порядок следования «цифр» определяется пользователем. Это усложнит определение порядка.

Однажды я написал что-то класс, который делает это (может потребоваться некоторый рефакторинг): https://gist.github.com/4058176

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