Rails - Создание UID для модели - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть модель PhotoAlbum.

Я бы хотел, чтобы Rails волшебным образом создал UID для PhotoAlbum при его создании.Предпочтительно очень длинный цифр / буквенно-цифровой UID, как если бы у плохого парня был этот UID, они могли бы делать плохие вещи.

Предложения по:

  • Что использовать для создания UID
  • Где назначить UID, могу ли я сделать это в схеме как значение по умолчанию?Или в модели, как до или, может быть, после создания?Какой умный способ сделать это?

Спасибо

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

Rails обрабатывает идентификаторы базы данных для вас по умолчанию.

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

2 голосов
/ 19 ноября 2010

Как насчет простого шестнадцатеричного ключа? Просто возьмите комбинацию псевдослучайных данных и данных модели и вставьте их в hexdigest, чтобы получить красивый довольно уникальный ключ, простая проверка может убедиться, что он действительно уникален.

class Album
  before_create :set_uid

  protected
    def set_uid
      # This only works before_create obviously, otherwise it would
      # find itself and loop eternally.
      while self.uid.blank? or !Album.find_by_uid(self.uid).blank?
        self.uid = Digest::SHA1.hexdigest("--#{self.title}--#{Time.current.usec}--")
      end
    end
end

Возможно, вы могли бы это немного почистить, но это должно сработать.

Что касается этого в схеме, я думаю, это зависит от того, какой движок базы данных вы используете, я там не эксперт;)

0 голосов
/ 19 ноября 2010

Как насчет использования ловушки after_initialize?

Я работаю в предположении, что вы не хотите, чтобы UUID был вашим первичным ключом (иначе все сложнее).Я бы избежал этого для ваших целей.

Я делаю все это без тестирования, к сожалению, поэтому я не могу быть на 100% уверен, что я не сделал никаких опечаток.Если у вас возникнут какие-либо проблемы, не стесняйтесь сообщать мне.

Во-первых, вам нужно добавить uuidtools в ваш проект.Предполагая, что rails 2, это в config / environment.rb

Rails::Initializer.run do |config|
  ..
  # You can try a later uuidtools version, but this is the one I've worked with
  config.gem "uuidtools", :version => '2.1.1'
  ..
end

После того, как вы добавили вышеперечисленное, запустите "sudo rake gems: install", и он должен загрузить и установить гем.

Затем в вашей модели добавьте этот код:

  validates_length_of :uuid, :is => 36 # Untested.. makes sense to me though
  def after_initialize
    self.uuid ||= UUIDTools::UUID.random_create.to_s
  end

И в процессе миграции для создания таблицы:

create table :photo_albums do |t|
  ..
  t.string :id, :limit => 36
  ..
end

Надеюсь, это поможет.

Oskar

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