2012-01-21 11 views
7

Estoy intentando cambiar la posibilidad nil de un atributo booleano en la columna existente :access_titles en la tabla :profiles. existe esa columna a causa de esta migración:change_column_null para la columna existente

class AddAccessItemsToProfiles < ActiveRecord::Migration 
    def self.up 
    add_column :profiles, :access_items, :boolean, :default => true 
    end 

    def self.down 
    remove_column :profiles, :access_items, :boolean, :default => nil 
    end 
end 

Para cambiar nil, he intentado generar una migración como siempre he hecho:

rails g migration ChangeColumnNull :profiles :access_items :null => false 

Pero eso no hice nada, así que lo hice una migración independiente:

rails g migration AddChangeColumnNullToAccessItems 

Y dentro de ese añadí:

class AddChangeColumnNullToAccessItems < ActiveRecord::Migration 
    def self.up 
    change_column_null :profiles, :access_items, :boolean, false 
    end 

    def self.down 
    change_column_null :profiles, :access_items, :boolean, true 
    end 
end 

Luego ejecuté rake db:migrate, reinicié mi servidor y no vi ningún cambio. Así que he intentado:

class AddChangeColumnNullToAccessItems < ActiveRecord::Migration 
    def self.up 
    change_column_null :profiles, :access_items, false 
    end 

    def self.down 
    change_column_null :profiles, :access_items, true 
    end 
end 

Luego hizo lo mismo: rake db:migrate, reinicia el servidor, y nada ha cambiado.

¿Qué estoy haciendo mal? Esperaba que el valor booleano de :access_items solo fuera verdadero y falso sin tener que volcar la base de datos.

ACTUALIZACIÓN: Tratando change_column_null :profiles, :access_items, false me dio un error:

-- change_column_null(:profiles, :access_items, false) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

PGError: ERROR: column "access_items" contains null values 
: ALTER TABLE "profiles" ALTER "access_items" SET NOT NULL 

Por lo tanto, por los consejos a continuación tenía que insertar change_column_null :profiles, :access_items, false, true en mi migración.

Respuesta

21

que puede utilizar:

change_column_null :profiles, :access_items, false, 1 

El cuarto parámetro es opcional y le permite establecer el valor predeterminado para la columna. Esto es obligatorio cuando tiene nulos en una columna y está configurando el valor nulo en false.

+1

Tuve que agregar la cuarta columna después de todo. Gracias una vez más! – tvalent2

+0

No sabía que el cuarto parámetro era incluso posible. Hubiera pensado que esto ocurre tan a menudo que sería necesario. –

Cuestiones relacionadas