#ruby-on-rails #postgresql #database-migration #uuid
#ruby-on-rails #postgresql #база данных-миграция #uuid
Вопрос:
Я использую uuid вместо bigint в качестве основного ключа. И следующая миграция
class CreateProjects < ActiveRecord::Migration[6.0]
def change
create_table :projects, id: :uuid do |t|
t.string :title
t.references :user, null: false, foreign_key: true
t.timestamps
end
end
end
сбой с ошибкой:
PG::DatatypeMismatch: ERROR: foreign key constraint "fk_rails_b872a6760a" cannot be implemented
DETAIL: Key columns "user_id" and "id" are of incompatible types: bigint and uuid.
Комментарии:
1. Может быть, это помогает github.com/rails/rails/issues/23422
2. @Salil, в частности , комментарий рафачева, в котором предлагается
t.belongs_to ... type: :uuid
(PS:t.belongs_to
является псевдонимом дляt.references
).
Ответ №1:
t.references
по умолчанию предполагается, что другая таблица имеет bigint
первичный ключ, и поле внешнего ключа также является bigint
. После добавления внешнего ключа это несоответствие обнаруживается, и миграция завершается неудачей.
Используйте type: :uuid
, чтобы указать, что столбец действительно должен быть a uuid
.
t.references :user, null: false, foreign_key: true, type: :uuid
Я сам в своих проектах отслеживаю это, помня, что у каждой ссылки / принадлежности должно быть 4 варианта. null
, foreign_key
, type
и index
. Это заставляет меня задуматься о каждом из 4 вариантов, даже если я решу оставить их значения по умолчанию.
Комментарии:
1. Ты мой герой! Спасибо