Pregunta

tengo el problema, que tengo una migración en los carriles que establece un valor predeterminado para una columna, como en este ejemplo:

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

Supongamos, me gusta dejar que los ajustes predeterminados en una migración más tarde, ¿cómo puedo hacer que con el uso de carriles migraciones?

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

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 en la base de datos subyacente es la interpretación de este comando. En caso de un cambio de la base de datos esta consulta podría tal vez ya no funciona y la migración sería roto. Por lo tanto, hay una manera de expresar la acción de deshacer de un valor predeterminado para una columna en los carriles?

¿Fue útil?

Solución

Carriles 5 +

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

Carriles 3 y los carriles 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

Otros consejos

Suena como que está 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 por defecto   NULL, estás de suerte. Necesitas   a DatabaseStatements # ejecutan el   sentencia SQL apropiada para su caso.   Ejemplos

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

El siguiente fragmento que utilizo para hacer columnas NULL 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

Carriles 4

change_column :courses, :name, :string, limit: 100, null: false
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top