在Rails中,如何创建将更改主键类型的迁移?

时间:2016-08-29 20:52:17

标签: ruby-on-rails postgresql migration primary-key uuid

我正在使用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类型的迁移,以及如何更新链接到表的所有外键?

谢谢, - 戴夫

1 个答案:

答案 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约束,uniquenesslength