2011-10-28 19 views
9

Estoy utilizando Rails 3.1.1 con PostgreSQL 9.1 y earthdistance module. Para poder calcular correctamente la distancia entre diferentes ubicaciones, configuré una columna con el tipo earth en mi tabla branches.Tipo de base de datos personalizada en ActiveRecord

El problema que estoy experimentando ahora es que mi aplicación Rails que utiliza esta tabla no entiende el tipo de tierra y por lo tanto estoy consiguiendo esto en mi db/schema.rb:

# Could not dump table "branches" because of following StandardError 
# Unknown type 'earth' for column 'location'

Esto es problemático, ya que ahora puede' Crear mi base de datos de prueba desde schema.rb.

¿Cómo puedo agregar este tipo a AR o hacer que pase por alto esa columna?

+1

encontrado la respuesta a la pregunta aquí: http://stackoverflow.com/questions/383058/rails-schema-creation-problem –

+7

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

Respuesta

5

Prueba esto:

cambio que config/application.rb

config.active_record.schema_format = :sql 

esto va a cambiar el formato de salida para el formato nativo de PostgreSQL SQL, schema.rb se desactivará y un nuevo archivo Se generará /db/config/structure.sql

+0

Lo intenté, pero los rieles 'db: schema: load' aún parecen buscar el archivo' schema.rb'. –

+0

Parece que tiene que usar 'rake db: structure: load' en su lugar. –

5

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.

+0

Esto no funciona para mí en Rails 4.2.8, ¿hay alguna otra formulación que deba usar? –

+0

¿Puedes compartir más información sobre el error al que te has tropezado y quizás poner tu código en una esencia y buscarme en él? –

+0

ejecuté exactamente lo que escribiste y no está funcionando en 5.0.1 – Kasumi

Cuestiones relacionadas