Почему сбой миграции Rails?

#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. Ты мой герой! Спасибо