欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Ruby on Rails和PostgreSQL自动生成UUID的教程

程序员文章站 2022-11-15 20:08:44
rails 4 能原生态的支持postgres 中的uuid(universally unique identifier,可通用的唯一标识符)类型。在此,我将向你描述如何在...

rails 4 能原生态的支持postgres 中的uuid(universally unique identifier,可通用的唯一标识符)类型。在此,我将向你描述如何在不用手工修改任何rails代码的情况下,用它来生成uuid。

首先,你需要激活postgres的扩展插件‘uuid-ossp':
 

class createuuidpsqlextension < activerecord::migration
 def self.up
  execute "create extension \"uuid-ossp\";"
 end
 
 def self.down
  execute "drop extension \"uuid-ossp\";"
 end
end

你可以用uuid作为一个id来进行替换:

 

create_table :translations, id: :uuid do |t|
 t.string :title
 t.timestamps
end

在此例中,翻译表会把一个uuid作为id来自动生成它。postgresq的uuid-ossp扩展插件所用算法和生成uuid的算法是不同的。rails 4缺省使用的是v4算法. 你可以在这里: http://www.postgresql.org/docs/current/static/uuid-ossp.html 看到更多有关这些算法的细节。


然而,有时候你不想用uuid作为id来进行替换。那么,你可以另起一列来放置它:
 

class adduuidtomodelsthatneedit < activerecord::migration
 def up
  add_column :translations, :uuid, :uuid
 end
 
 def down
  remove_column :invoices, :uuid
 end
end

这会创建一个放置uuid的列,但这个uuid不会自动生成。你不得不在rails中用securerandom来生成它。但是,我们认为这是一个典型的数据库职责行为。值得庆幸的是,add_column中的缺省选项会帮我们实现这种行为:

 

class adduuidtomodelsthatneedit < activerecord::migration
 def up
  add_column :translations, :uuid, :uuid, :default => "uuid_generate_v4()"
 end
 
 def down
  remove_column :invoices, :uuid
 end
end

现在,uuid能被自动创建了。同理也适用于已有记录!