2009-05-20 23 views
185

tengo el problema, que tengo una migración en los carriles que establece un valor predeterminado para una columna, como en este ejemplo:Rieles migraciones: Deshacer ajuste por defecto para una columna

def self.up 
    add_column :column_name, :bought_at, :datetime, :default => Time.now 
end 

Supongamos, me gusta soltar esa configuración predeterminada en una migración posterior, ¿cómo hago eso con el uso de migraciones de rieles?

Mi solución actual es la ejecución de un comando SQL personalizada en la migración de los carriles, así:

def self.up 
    execute 'alter table column_name alter bought_at drop default' 
end 

Pero no me gusta este enfoque, porque yo soy ahora depende de la forma subyacente es la base de datos interpretando este comando. En caso de un cambio en la base de datos, es posible que esta consulta ya no funcione y la migración se rompa. Entonces, ¿hay alguna manera de expresar el deshacer de una configuración predeterminada para una columna en rieles?

Respuesta

375

change_column_default(table_name, column_name, nil) también trabaja para dejar el valor por defecto de la columna en su totalidad. No es necesario usar execute.

+7

En postgres, esto no soltará el valor predeterminado para las columnas 'CHARACTER VARYING', simplemente ajústelo a' NULL :: character variation '. –

+7

En versiones más recientes, puede hacer que sea reversible. Por ejemplo: 'change_column_default (: table_name,: column_name, from: nil, to: false)' – Mark

+1

@AttilaO. He tenido éxito ejecutando 'ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT', no hay necesidad de establecerlo en' NULL', creo. –

22

Sounds que estás haciendo lo correcto con su 'ejecutar', ya que los documentos señalan:

change_column_default(table_name, column_name, default) 

establece un nuevo valor predeterminado de una columna. Si desea establecer el valor predeterminado en NULO, no tiene suerte. Necesita para DatabaseStatements # ejecute la declaración SQL apropiada usted mismo. Ejemplos

change_column_default(:suppliers, :qualification, 'new') 
change_column_default(:accounts, :authorized, 1) 
+0

Gracias! ¡No he encontrado esta sugerencia en los documentos por mi cuenta! Espero que construyan en la caída de los valores predeterminados en las migraciones en las versiones futuras de los rieles. – wulfovitch

+1

Esto ya no es cierto desde Rails 3.1.0, cfr. http://apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default – asymmetric

14

El siguiente fragmento de código que utilizo para hacer NULL columnas NOT NULL, pero evita DEFAULT a nivel de esquema:

def self.up 
    change_column :table, :column, :string, :null => false, :default => "" 
    change_column_default(:table, :column, nil) 
end 
+0

No veo valor agregado en esta respuesta ya que la aceptada dice lo mismo. – Mosselman

+4

esto es en realidad el que más me ayudó, ya que dio un uso de ejemplo ... – rogerdpack

-3

Carriles 4

change_column :courses, :name, :string, limit: 100, null: false 
+10

Esto agrega una restricción NOT NULL, no tiene nada que ver con DEFAULT – Extrapolator

+0

no tiene nada que ver con DEFAULT +1 –

Cuestiones relacionadas