ruby-on-rails - migraciones - llaves foraneas ruby on rails
Agregar un valor predeterminado a una columna a través de una migración (7)
¿Cómo agrego un valor predeterminado a una columna que ya existe a través de una migración?
Toda la documentación que puedo encontrar le muestra cómo hacerlo si la columna no existe, pero en este caso sí.
** Rieles 4.X + **
A partir de Rails 4 no puede generar una migración para agregar una columna a una tabla con un valor predeterminado. Los siguientes pasos agregan una nueva columna a una tabla existente con un valor predeterminado verdadero o falso.
1. Ejecute la migración desde la línea de comandos para agregar la nueva columna
$ rails generate migration add_columnname_to_tablename columnname:boolean
El comando anterior agregará una nueva columna en su tabla.
2. Establezca el nuevo valor de columna en VERDADERO / FALSO editando el nuevo archivo de migración creado.
class AddColumnnameToTablename < ActiveRecord::Migration
def change
add_column :table_name, :column_name, :boolean, default: false
end
end
** 3. Para realizar los cambios en la tabla de la base de datos de la aplicación, ejecute el siguiente comando en la terminal **
$ rake db:migrate
Así es como debes hacerlo:
change_column :users, :admin, :boolean, :default => false
Pero algunas bases de datos, como PostgreSQL, no actualizarán el campo para las filas creadas anteriormente, así que asegúrese de actualizar el campo de forma manual en la migración también.
Ejecutar:
rails generate migration add_column_to_table column:boolean
Se generará esta migración:
class AddColumnToTable < ActiveRecord::Migration
def change
add_column :table, :column, :boolean
end
end
Establecer el valor predeterminado añadiendo: predeterminado => 1
add_column: table,: column,: boolean,: default => 1
Correr:
rastrillo db: migrar
El uso de def change
significa que debe escribir migraciones que sean reversibles. Y change_column
no es reversible. Puedes subir pero no puedes bajar, ya que change_column
es irreversible.
En su lugar, aunque puede ser un par de líneas adicionales, debe usar def up
y def down
Entonces, si tiene una columna sin valor predeterminado, debe hacer esto para agregar un valor predeterminado.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: nil
end
O si desea cambiar el valor predeterminado para una columna existente.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: true
end
Esto es lo que puedes hacer:
class Profile < ActiveRecord::Base
before_save :set_default_val
def set_default_val
self.send_updates = ''val'' unless self.send_updates
end
end
Para Rails 4+, use change_column_default
def change
change_column_default :table, :column, value
end
Aquí hay un enlace a la documentación change_column_default .
change_column_default :employees, :foreign, false