Вот как я решил эту проблему:
1) В моей миграции я разрешил миграции автоматически генерировать id и id_sequence и добавил фиктивный столбец uuid (здесь он называется guid). Это был просто самый простой путь развития. Так что для
class Thing < ActiveRecord::Base
attr_accessible :name, :description, :guid
end
Я использую миграцию
class CreateThings < ActiveRecord::Migration
def change
create_table :things do |t|
t.string :name
t.string :description
t.uuid :guid
t.timestamps
end
end
end
2) После миграции я могу запустить следующее через клиент sql
ALTER TABLE things DROP CONSTRAINT things_pkey;
ALTER TABLE things ADD PRIMARY KEY (guid);
ALTER TABLE things DROP COLUMN id;
ALTER TABLE things RENAME COLUMN guid TO id;
3) Я использую два драгоценных камня, чтобы помочь с этим
gem 'uuidtools'
gem 'postgres_ext'
Ясно, что мое решение направлено против БД Postgres ... но я публикую это, потому что это кажется относящимся к одной из ваших проблем, а именно, как вы используете Rails, чтобы держать БД на расстоянии вытянутой руки? Во всяком случае, UUIDtools не зависит от БД.
4) В моем классе Thing я использую это
class Thing < ActiveRecord::Base
include Extensions::UUID
где UUID - просто модуль, подобный этому
module Extensions
module UUID
extend ActiveSupport::Concern
included do
# set_primary_key 'guid'
before_create :generate_uuid
def generate_uuid
self.id = UUIDTools::UUID.random_create.to_s
end
end
end
end
Кстати, я нашел последнее в этой сущности:
https://gist.github.com/rmoriz/937739
Но мое решение немного отличается.