sql >> Base de Datos >  >> RDS >> PostgreSQL

Tipos enumerados con ActiveRecord y Postgresql

Debe cambiar de db/schema.rb a db/structure.sql .

El problema subyacente es que schema.rb es una representación de la estructura de la base de datos tal como la ve ActiveRecord, pero ActiveRecord no entiende muchas cosas (como create type , CHECK restricciones y otras cosas que aparecen en execute some_raw_sql declaraciones en migraciones) que hace PostgreSQL. Puedes create type todo lo que quieras menos schema.rb nunca lo verá.

Si desea usar cosas que ActiveRecord no entiende, debe usar db/structure.sql para almacenar la estructura de su base de datos. structure.sql almacena la estructura de la base de datos como la entiende la base de datos, no como la entiende ActiveRecord.

Cambiar es fácil:

  1. Actualice su config/application.rb para contener config.active_record.schema_format = :sql .
  2. Haga un rake db:structure:dump para obtener un db/structure.sql inicial .
  3. Eliminar db/schema.rb desde su árbol de directorios y control de revisiones.
  4. Añadir db/structure.sql al control de revisiones.
  5. Ajuste sus hábitos de rake:
    • Usar db:structure:dump en lugar de db:schema:dump
    • Usar db:structure:load en lugar de db:schema:load

Dicho esto, no estoy seguro de qué tan bien enum nativo de PostgreSQL los tipos interactuarán con ActiveRecord como nunca lo he hecho. enum de AR s son una traducción del lado del cliente entre cadenas y enteros pero PostgreSQL's enum s se manejan dentro de la base de datos y no se conocen entre sí. Puede haber conflictos y deberá asegurarse de mantenerlos sincronizados entre sí.