2013-08-14 2 views
56

Я использую Rails 3.0.20 и рубин 1.8.7 (2011-06-30) 352 номера патчейМне нужно создать uuid для моего приложения rails. Какие у меня варианты (драгоценные камни)?

Пожалуйста, предложите мне лучший плагин для создания справ.

+0

http://stackoverflow.com/questions/6021372/best-way-to -create-unique-token-in-rails – Muntasim

+0

Виртуальный, невозможно установить неверный ответ, и это сомнительно. Но я настоятельно рекомендую вам взглянуть на ответ @ apneadiving.Imho, это правильный ответ, и многие люди пропустят его, потому что он находится внизу страницы. –

ответ

179

Есть много вариантов, я рекомендую не добавлять дополнительные зависимости и использовать SecureRandom что встроенная:

SecureRandom.uuid #=> "1ca71cd6-08c4-4855-9381-2f41aeffe59c" 

другие возможные форматы here.

+0

Я бы предложил, чтобы этот комментарий был правильно проверенным. UUID - это универсальный формат для GUID, но что-то действительно идет. –

+1

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

+1

SecureRandom # uuid, похоже, не находится в Ruby 1.8.7. Похоже, что он был добавлен в 1.9.3: http://apidock.com/ruby/v1_9_3_392/SecureRandom/uuid/class – existentialmutt

10

Первое, что я хотел бы предложить, - это обновить версию рубинов и рельсов.

Очень хороший способ генерации guid - SecureRandom, который является рубиновым модулем. С легким использованием.

require 'securerandom' 
guid = SecureRandom.hex(10) #or whatever value you want instead of 10 
+4

'require 'securerandom'' больше не требуется при использовании Rails 3.1 или выше. –

+0

UUID имеет RFC! Это нарушит любую проверку UUID (как в PostgreSQL) – kixorz

3

Пожалуйста, смотрите в деталях, как использовать SecureRandom рубиновый стандартную библиотеку использовать UUID с примером в рельсах 3.X и 4.X

создать usesguid.rb файл в LIB/usesguid.rb и вставьте код ниже в том, что -

require 'securerandom' 

module ActiveRecord 
    module Usesguid #:nodoc: 
    def self.append_features(base) 
     super 
     base.extend(ClassMethods) 
    end 

    module ClassMethods 
     def usesguid(options = {}) 
     class_eval do 
      self.primary_key = options[:column] if options[:column] 
      after_initialize :create_id 
      def create_id 
      self.id ||= SecureRandom.uuid 
      end 
     end 
     end 
    end 
    end 
end 
ActiveRecord::Base.class_eval do 
    include ActiveRecord::Usesguid 
end 

добавить следующую строку в конфигурационный/application.rb для загрузки файла -

require File.dirname(__FILE__) + '/../lib/usesguid' 

Создание сценария перенастройки для функции UUID, как указано ниже -

class CreateUuidFunction < ActiveRecord::Migration 
    def self.up 
    execute "create or replace function uuid() returns uuid as 'uuid-ossp', 'uuid_generate_v1' volatile strict language C;" 
    end 

    def self.down 
    execute "drop function uuid();" 
    end 
end 

Вот пример для миграции контакта, как мы можем использовать его -

class CreateContacts < ActiveRecord::Migration 
    def change 
    create_table :contacts, id: false do |t| 
     t.column :id, :uuid, null:false 
     t.string :name 
     t.string :mobile_no 

     t.timestamps 
    end 
    end 
end 

Окончательная как использовать в вашей модели

class Contact < ActiveRecord::Base 
    usesguid 

end 

Это поможет вам настроить UUID для вашего приложения rails.

Это может быть полезно для Rails 3.0, 3.1, 3.2 и 4.0.

Пожалуйста, дайте мне знать Если у вас возникли проблемы при использовании, это так просто!

Другие варианты Rails4 here

+0

Моя причина использовать это в Rails 4, на самом деле я хотел использовать более раннюю версию postgreSQL. Если у вас нет такой зависимости, вы можете использовать встроенную функцию. –

3

Я предложил бы использовать PostgreSQL и использовать UUID столбец, построенный в это autogenerates UUID в зависимости от типа создаваемого столбца.

Пример в Rails 3 миграции

execute <<-SQL CREATE TABLE some_items (id uuid PRIMARY KEY DEFAULT uuid_generate_v1()); SQL

Может быть лучший способ сделать это в Rails 4.

+1

Мне нравится этот подход; можете ли вы добавить более подробную информацию? – therealrootuser

+3

Нет упоминания об использовании PG в вопросе. Рекомендовать новую систему баз данных не очень помогает ... – Ger

Смежные вопросы