хеш вместо id - PullRequest
       2

хеш вместо id

8 голосов
/ 31 марта 2011

Я хочу использовать автоматически генерируемые хеши вместо автоматически увеличиваемых целых чисел в моих активных записях в качестве первичных ключей. Это поднимает два вопроса:

  1. как выполнить это поколение в самый эффективный способ?
  2. как справиться с возможностью того, что сгенерированный хеш уже существует в таблица

С уважением, Матеуш

Ответы [ 4 ]

8 голосов
/ 07 октября 2014

Если вы хотите это, потому что вы не хотите показывать идентификатор в веб-URL. Вы можете использовать драгоценный камень как https://github.com/peterhellberg/hashids.rb

Он создает обратимый хеш из идентификатора вашей базы данных, поэтому хеш не нужно хранить в базе данных.

Используйте его в своих моделях to_param метод.

class MyModel < ActiveRecord::Base

  def to_param
    Hashids.new("salt").encode(id)
  end
end

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

def show
  id = Hashids.new("salt").decode(params[:id]).try(:first)
  record = MyModel.find(id)
end
4 голосов
/ 25 сентября 2012

Это может быть не совсем то, что вы просили.Но у меня была похожая проблема, когда я хотел использовать хеш вместо идентификатора в URL.Мое решение следует

  1. Я добавил в свою таблицу столбец с названием privatelink
  2. В моей модели я написал:
  #changes the url to use privatelink instead of the id
  def to_param
    privatelink
  end

  #calls the private method set_privatelink
  before_create :set_privatelink

  private

  #generates a unique hash looking something like this: c24bea1693d9e56a1878cb83f252fba05532d9d0
  def set_privatelink
    self.privatelink = Digest::SHA1.hexdigest([Time.now, rand].join)
  end

Источник: Railcast # 63 Название модели в URL - показывает, как использовать метод to_param

2 голосов
/ 31 марта 2011

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

Назначение каждому пользователю уникального хэша в 100 символов в Ruby on Rails

0 голосов
/ 31 марта 2011

При использовании Oracle у меня был случай, когда я хотел создать идентификатор самостоятельно (а не использовать последовательность), и в этом посте я предоставляю подробности, как я это сделал. Короче код:

# a small patch as proposed by the author of OracleEnhancedAdapter: http://blog.rayapps.com/2008/05/13/activerecord-oracle-enhanced-adapter/#comment-240
# if a ActiveRecord model has a sequence with name "autogenerated", the id will not be filled in from any sequence
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
  alias_method :orig_next_sequence_value, :next_sequence_value

  def next_sequence_value(sequence_name)
    if sequence_name == 'autogenerated'
      # we assume id must have gotten a good value before insert!
      id
    else
      orig_next_sequence_value(sequence_name)
    end
  end
end

Хотя это решение относится только к Oracle, я предполагаю, что в других адаптерах вы можете отменить тот же метод (next_sequence_value).

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