Обратите внимание, что ответ mkirk создает поддельный первичный ключ . Это объясняет, почему ActiveRecord нужно сообщить, что такое первичный ключ. При осмотре таблицы выявляется
Table "public.acquisitions"
Column | Type | Modifiers
--------+----------------------+-----------
state | character varying(2) |
name | character varying |
Indexes:
"index_acquisitions_on_state" UNIQUE, btree (state)
На практике это работает, как и ожидалось, поэтому в этом нет ничего плохого, но это может быть лучше.
Мы можем сохранить столбец id
и изменить его тип на string
*. Миграция выглядит как
class CreateAcquisitionsTable < ActiveRecord::Migration
def change
create_table :acquisitions do |t|
t.string :name
end
change_column :acquisitions, :id, :string, limit: 2
end
end
Проверка таблицы показывает, что у вас есть фактический первичный ключ со всеми полезностями, такими как ограничение уникального ключа (без уникального индекса), отсутствие нулевого ограничения и автоматическое увеличение ключа.
Table "public.acquisitions"
Column | Type | Modifiers
--------+----------------------+---------------------------------------------------
id | character varying(2) | not null default nextval('acquisitions_id_seq'::regclass)
name | character varying |
Indexes:
"acquisitions_pkey" PRIMARY KEY, btree (id)
И вам не нужно явно указывать ActiveRecord, что является основным.
Возможно, вы захотите установить идентификатор по умолчанию, если он не указан.
class MyModel < ActiveRecord::Base
before_create do
self.id = SecureRandom.uuid unless self.id
end
end
* Отказ от ответственности: не следует изменять первичный ключ по умолчанию, если у вас нет веских причин на