我正在使用PostGres的Rails 4.2.7。我创建了几个表,所有表都有数字主键。下面是我的一个Rails迁移的示例
class CreateMyObjects < ActiveRecord::Migration
def change
create_table :my_objects do |t|
t.string :name
t.date :day
t.references :user, index: true, foreign_key: true
t.timestamps null: false
end
end
end
我在这个表中没有任何数据,但我确实有几个表通过外键链接到它。我想将主键从数字主键更改为GUID(UUID),因为我将会遇到在两个不同的数据库中创建数据的情况,我不希望在我发生主键冲突时合并数据。如何创建将主键类型从数字更改为我的UUID类型的迁移,以及如何更新链接到表的所有外键?
谢谢, - 戴夫
答案 0 :(得分:3)
class ChangePrimaryKey < ActiveRecord::Migration
def change
remove_column :my_objects, :id # remove existing primary key
add_column :my_objects, :uuid, :string
execute "ALTER TABLE my_objects ADD PRIMARY KEY (uuid);"
end
end
class MyObject < ActiveRecord::Base
self.primary_key = :uuid
end
关于自动递增 - 不,Rails不会为您增加字符串id
,因此您必须自己处理它。
您可以在模型中使用before_create
回调:
before_create :generate_uuid
private
def generate_uuid
loop do
self.uuid = SecureRandom.base64(16) # or other way to generate uniq string
break unless self.class.find_by(uuid: uuid) # make sure you don't repeat the uuid
end
end
您还可以向primary_key列添加约束,例如not null
约束,uniqueness
,length
等