PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Tipos enumerados com ActiveRecord e Postgresql


Você precisa mudar de db/schema.rb para db/structure.sql .

O problema subjacente é que schema.rb éuma representação da estrutura da base de dados tal como o ActiveRecord a vê mas o ActiveRecord não compreende muitas coisas (como create type , CHECK restrições e outras coisas que aparecem em execute some_raw_sql instruções em migrações) que o PostgreSQL faz. Você pode create type tudo o que você quer, mas schema.rb nunca vai ver.

Se você quiser usar coisas que o ActiveRecord não entende, você deve usar db/structure.sql para armazenar a estrutura do seu banco de dados. structure.sql armazena a estrutura do banco de dados como o banco de dados a entende, não como o ActiveRecord a entende.

A comutação é fácil:
  1. Atualize seu config/application.rb para conter config.active_record.schema_format = :sql .
  2. Faça um rake db:structure:dump para obter um db/structure.sql inicial .
  3. Excluir db/schema.rb da sua árvore de diretórios e controle de revisão.
  4. Adicionar db/structure.sql ao controle de revisão.
  5. Ajuste seus hábitos de rake:
    • Usar db:structure:dump em vez de db:schema:dump
    • Usar db:structure:load em vez de db:schema:load

Dito isso, não tenho certeza de quão bem o enum nativo do PostgreSQL tipos irão interagir com o ActiveRecord como eu nunca fiz. enum do AR s são uma tradução do lado do cliente entre strings e inteiros, mas enum s são tratados dentro do banco de dados e eles não sabem um do outro. Pode haver conflitos e você precisará mantê-los sincronizados entre si.