2011-04-02 18 views
10

Falló la migración de los rieles para convertir una columna de tiempo "deleted_at" en una columna de fecha y hora. ¿Alguna idea sobre cómo resolver esto? Es una instalación nueva de Postgres si eso es relevante.Rails & Postgres: la migración a change_colomn da el error "no se puede convertir para escribir timestamp sin zona horaria"

-- change_column(:products, :deleted_at, :datetime) 


PGError: ERROR: column "deleted_at" cannot be cast to type timestamp without time zone 
: ALTER TABLE "products" ALTER COLUMN "deleted_at" TYPE timestamp 

Respuesta

7

Usted no puede alterar el tipo de un campo de vez en marca de tiempo ("fecha y hora"), ya que los valores no se pueden convertir - la base de datos no sabe la fecha.

Puede, sin embargo, quitar y volver a crear la columna:

ALTER TABLE products DROP COLUMN deleted_at; 
ALTER TABLE products ADD COLUMN deleted_at timestamp; 

O si este campo se establece en NO NULO, en su lugar debe hacer:

ALTER TABLE products ADD COLUMN deleted_at timestamp NOT NULL; 

Pero si insistes en la retención de los valores falsos en esta tabla como Sean, puede utilizar ALTER ... TIPO dE uSO ... como esto:

ALTER TABLE products ALTER COLUMN deleted_at TYPE timestamp USING 
    CASE WHEN deleted_at IS NOT NULL THEN timestamp '1970-01-01 00:00:00' END; 
-- Or: 
ALTER TABLE products ALTER COLUMN deleted_at 
    TYPE timestamp USING date '1970-01-01' + deleted_at; 
+0

Pero esto también arrojará todos los valores dentro de deleted_at. ¿Cómo puede ser esa la solución? –

+0

@OtoBrglez Los valores son bastante inútiles para empezar: el tipo de columna anterior solo almacena la * hora del día *, pero no la * fecha *. No hay una forma razonable de convertirlos a datetime. – intgr

+0

Esta es una mala solución. Muchos sistemas usan 'deleted_at' para determinar si un producto se elimina o no. Eliminar la columna y leer tiene el efecto secundario de __un-borrar__ estos registros !! – Sean

9

en Trenes s esto se parecería a algo como

class ChangeStatusUpdatedAtToDateTime < ActiveRecord::Migration 
    def up 
    remove_column :bookings, :status_updated_at 
    add_column :bookings, :status_updated_at, :datetime 
    end 

    def down 
    remove_column :bookings, :status_updated_at 
    add_column :bookings, :status_updated_at, :time 
    end 
end 
Cuestiones relacionadas