Otro caso en el que alguien podría encontrarse con esto es cuando inserte sus tipos de postgres personalizados (enums) en postgresql. Si uno hace esto y aún quiere usar Ruby para su schema.rb, puede agregar tipos de base de datos personalizados a la lista de tipos válidos del adaptador.
Por ejemplo, supongamos que tiene una migración como esa, con address_type
y address_status
.
class CreateAddresses < ActiveRecord::Migration
def up
execute <<-SQL
CREATE TYPE address_status AS ENUM ('active', 'archived');
CREATE TYPE address_type AS ENUM ('billing', 'shipping');
SQL
create_table :customer_addresses do |t|
# bla bla
t.column :address_type, :address_type
t.column :status, :address_status
t.timestamps null: false
end
end
def down
drop_table :customer_addresses
execute <<-SQL
DROP TYPE address_type;
DROP TYPE address_status;
SQL
end
end
Luego, en crear un inicializador o añadir algo como esto a su application.rb:
# config/initializers/postres_enum_custom_types.rb
module ActiveRecord
module ConnectionAdapters
if const_defined?(:PostgreSQLAdapter)
class PostgreSQLAdapter
NATIVE_DATABASE_TYPES.merge!(
address_status: { name: 'character varying' },
address_type: { name: 'character varying' }
)
end
end
end
end
Notas sobre mi solución:
- estoy comprobando la existencia de la
PostgreSQLAdpater
porque de la forma en que una gema de análisis estático que estoy usando carga parcialmente algunas dependencias AR, específicamente la gema annotate
.
- La fuente de la definición original is here.
Antecedentes sobre mi carrera en esto: Cuando esto sucedió a mí en los carriles 5.0.x, las migraciones funcionó muy bien, pero entonces mi entorno de prueba fracasaría al intentar ejecutar db:test:prepare
o db:reset
. Me tomó bastante tiempo rastrear esto hasta el problema del volcado de esquema.
encontrado la respuesta a la pregunta aquí: http://stackoverflow.com/questions/383058/rails-schema-creation-problem –
Es de utilidad para otros para escribir una respuesta a incluso su propia pregunta y acéptalo También elimina esta pregunta de la lista no respondida. – Nick