我需要为我的Rails应用程序生成UUID。我有哪些选项(gems)?

113

我使用Rails 3.0.20和ruby 1.8.7(2011-06-30 patchlevel 352)。

请建议我使用最好的插件来生成guid。


https://dev59.com/H2025IYBdhLWcg3wZ1Ry - Muntasim
虚拟的,没有办法标记错误答案,这个概念本身也是值得怀疑的。但我强烈建议您查看@apneadiving的答案。在我看来,那才是正确的答案,很多人会错过它,因为它在页面底部。 - Damon Aw
1
所有新版本的Rails都提供了Digest::UUID,例如Digest::UUID.uuid_v4 - Tilo
4个回答

317

有很多选择,我建议不要添加额外的依赖项,而是使用内置的SecureRandom

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

查看其他可能的格式,请在此处查看。


1
我建议将此评论作为正确的答案。UUID是GUID的通用格式,但实际上可以使用任何格式。 - Eric Wanchic
1
我建议重新检查这个答案,因为它是一个内置功能,并且可以为PG生成有效的UUID。 - Damon Aw
1
SecureRandom#uuid 在 Ruby 1.8.7 中似乎不存在。看起来它是在 1.9.3 版本中添加的:http://apidock.com/ruby/v1_9_3_392/SecureRandom/uuid/class - existentialmutt
2
Ruby 1.8.x 不应再被使用。 - apneadiving
11
是的,当然。但问题明确提到了1.8.7版本。 - existentialmutt
显示剩余4条评论

17

我建议的第一件事是升级你的 ruby 和 rails 版本。

一个非常好的生成 GUID 的方式是使用 SecureRandom,它是一个具有易用性的 Ruby 模块。

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

5
如果使用Rails 3.1或更高版本,则不再需要require 'securerandom' - Eric Wanchic
1
UUID已经有RFC了!这将会破坏任何UUID验证(例如在PostgreSQL中)。 - adamkonrad
hex SecureRandom不是UUID。UUID字符串表示的正式定义在RFC 4122中解释了。 - undefined

3
我建议使用PostgreSQL,并使用内置的uuid列,它会根据您创建列时的类型自动生成UUID。
Rails 3迁移示例:
execute <<-SQL
  CREATE TABLE some_items (id uuid PRIMARY KEY DEFAULT uuid_generate_v1());
SQL

也许在Rails 4中有更好的方法来实现这一点。

1
我喜欢这种方法,你能添加更多细节吗? - therealrootuser
3
问题中没有提到使用PG。推荐一个新的数据库系统并没有太大帮助... - Gerard

2
请详细查看如何使用securerandom ruby标准库在rails 3.X和4.X中使用UUID的示例。
在lib / usesguid.rb中创建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

请在您的config/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

这将帮助您为Rails应用程序配置UUID。
这对于Rails 3.0、3.1、3.2和4.0同样有用。
如果您在使用时遇到任何问题,请告诉我,非常简单!
Rails4的其他选项在这里

我在Rails 4中使用它的原因是,我想使用早期版本的postgreSQL。如果您没有这样的依赖关系,那么可以使用内置功能。 - Rameshwar Vyevhare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接