2013-08-14 40 views
56

tôi sử dụng Rails 3.0.20 và ruby ​​1.8.7 (2011/06/30 patchlevel 352)Tôi cần tạo uuid cho ứng dụng đường ray của mình. Các tùy chọn (đá quý) tôi có là gì?

Xin gợi ý cho tôi các plugin tốt nhất để tạo guid.

+0

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

+0

Ảo, không có cách nào để gắn cờ một câu trả lời sai và khái niệm đó là vấn đề. Nhưng tôi đề nghị bạn hãy xem câu trả lời của @ apneadiving.Imho, đó là câu trả lời đúng và rất nhiều người sẽ bỏ lỡ nó bởi vì nó ở dưới cùng của trang. –

Trả lời

179

Có rất nhiều lựa chọn, tôi khuyên bạn không thêm phụ thuộc bổ sung và sử dụng SecureRandom đó là dựng sẵn:

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

Xem các định dạng khác có thể here.

+0

Tôi sẽ đề xuất nhận xét này là câu trả lời được kiểm tra chính xác. UUID là một định dạng phổ quát cho GUID, nhưng bất cứ điều gì thực sự đi. –

+1

Tôi sẽ đề nghị kiểm tra lại đây là câu trả lời đúng dựa trên thực tế là nó được xây dựng trong tính năng và nó tạo ra UUID hợp lệ cho PG. –

+1

SecureRandom # uuid không xuất hiện trong Ruby 1.8.7. Có vẻ như nó đã được thêm vào trong 1.9.3: http://apidock.com/ruby/v1_9_3_392/SecureRandom/uuid/class – existentialmutt

10

Điều đầu tiên tôi đề nghị là hãy nâng cấp phiên bản ruby ​​và đường ray của bạn.

Cách tốt nhất để tạo guid là SecureRandom, là mô-đun ruby. Với cách sử dụng dễ dàng.

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

'require 'securerandom'' không còn cần thiết nếu sử dụng Rails 3.1 hoặc cao hơn. –

+0

UUID có RFC! Điều này sẽ phá vỡ bất kỳ xác nhận UUID (như trong PostgreSQL) – kixorz

3

Xin vui lòng xem chi tiết, làm thế nào để sử dụng thư viện chuẩn SecureRandom ruby ​​để sử dụng UUID với ví dụ trong đường ray 3.x và 4.x

tạo file usesguid.rb trong lib của bạn/usesguid.rb và dán bên dưới mã trong đó -

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 

add dòng sau đây vào cấu hình của bạn/application.rb để tải tập tin -

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

Tạo kịch bản chuyển đổi cho chức năng UUID như đã đề cập dưới đây để -

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 

Dưới đây là ví dụ cho việc di chuyển tiếp xúc, làm thế nào chúng ta có thể sử dụng nó -

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 

cuối cùng làm thế nào để sử dụng vào mô hình của bạn

class Contact < ActiveRecord::Base 
    usesguid 

end 

Điều này sẽ giúp bạn định cấu hình UUID cho ứng dụng đường ray của bạn.

Điều này cũng hữu ích cho Rails 3.0, 3.1, 3.2 và 4.0.

Vui lòng cho tôi biết Nếu bạn có bất kỳ vấn đề nào trong khi sử dụng, thật đơn giản!

Các tùy chọn khác cho Rails4 here

+0

Lý do của tôi để sử dụng điều này trong Rails 4, Trên thực tế tôi muốn sử dụng phiên bản trước của postgreSQL. Nếu bạn không có sự phụ thuộc như vậy thì có thể đi cho tính năng dựng sẵn. –

3

tôi sẽ đề nghị sử dụng PostgreSQL và sử dụng cột uuid xây dựng trong, nó autogenerates UUID dựa trên loại bạn tạo cột.

Ví dụ trong Rails 3 di cư

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

Có thể là một cách tốt hơn để làm điều này trong Rails 4.

+1

Tôi thích cách tiếp cận này; bạn có thể thêm chi tiết hơn không? – therealrootuser

+3

Không đề cập đến việc sử dụng PG trong câu hỏi. Đề xuất một hệ thống cơ sở dữ liệu mới không giúp được nhiều ... – Ger