2013-08-14 20 views
56

używam Rails 3.0.20 i rubin 1.8.7 (2011-06-30 patchlevel 352)Potrzebuję wygenerować uuid dla mojej aplikacji rails. Jakie są dostępne opcje (klejnoty)?

Proszę zasugerować mi najlepszy plugin do wygenerowania GUID.

+0

http://stackoverflow.com/questions/6021372/best-way-to -utworzenie unikatowego tokena w szynach – Muntasim

+0

Wirtualny nie ma możliwości oznaczenia błędnej odpowiedzi, a pojęcie to jest wątpliwe. Ale zdecydowanie sugeruję, abyś spojrzał na odpowiedź @ apneadiving.Imho, to jest poprawna odpowiedź i wielu ludzi będzie jej brakować, ponieważ znajduje się na dole strony. –

Odpowiedz

179

Istnieje wiele opcji, polecam, aby nie dodawać dodatkowych zależności i używać SecureRandom która jest wbudowana:

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

Zobacz inne możliwe formaty here.

+0

Sugerowałbym, aby ten komentarz był poprawnie sprawdzoną odpowiedzią. UUID to uniwersalny format identyfikatorów GUID, ale wszystko, co naprawdę działa. –

+1

Proponuję ponowne sprawdzenie, czy jest to poprawna odpowiedź na podstawie faktu, że jest to wbudowana funkcja i generuje poprawne identyfikatory UUID dla PG. –

+1

SecureRandom # uuid nie jest w Rubim 1.8.7. Wygląda na to, że został dodany w wersji 1.9.3: http://apidock.com/ruby/v1_9_3_392/SecureRandom/uuid/class – existentialmutt

10

Pierwszą rzeczą, którą proponuję, jest uaktualnienie wersji ruby ​​i szyn.

Bardzo dobrym sposobem generowania guid jest SecureRandom, który jest modułem ruby. Dzięki łatwemu użyciu.

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

'require 'securerandom'' nie jest już konieczne, jeśli używasz Rails 3.1 lub wyższej. –

+0

UUID ma RFC! Spowoduje to złamanie wszelkich walidacji UUID (jak w PostgreSQL). – kixorz

3

Proszę zobaczyć w szczegółach, jak używać securerandom ruby ​​biblioteki standardowej do korzystania z UUID przykład w szynach 3.X 4.x

tworzyć usesguid.rb plik w lib/usesguid.rb i wklej poniższy kod, że -

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 

Dodaj następujący wiersz w config/environment.rb do załadowania pliku -

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

Utwórz skrypt migracji dla funkcji UUID jak wspomniano poniżej -

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 

Oto przykład do migracji kontaktów, jak możemy go używać -

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 

końcowy, jak używać do modelu

class Contact < ActiveRecord::Base 
    usesguid 

end 

Pomoże to skonfigurować UUID dla aplikacji szyny.

Może to być przydatne także dla Rails 3.0, 3.1, 3.2 i 4.0.

Proszę dać mi znać Jeśli masz jakiekolwiek problemy podczas korzystania, tak proste!

Inne opcje Rails4 here

+0

Mój powód, aby użyć tego w Rails 4, Właściwie chciałem użyć wcześniejszej wersji postgreSQL. Jeśli nie masz takiej zależności, możesz przejść do funkcji wbudowanej. –

3

Sugerowałbym użyciu PostgreSQL i stosując kolumnę uuid wbudowane, to autogenerates UUID na podstawie typu utworzyć kolumnę.

przykład w szynach 3 migracji

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

Może być lepszy sposób, to w szyny 4.

+1

Podoba mi się to podejście; czy mógłbyś dodać więcej szczegółów? – therealrootuser

+3

Nie ma żadnej wzmianki o używaniu PG w pytaniu. Polecanie nowego systemu baz danych nie jest zbyt pomocne ... – Ger