ruby-on-rails-3 - migrations - rails references
Agregar: predeterminado=> verdadero a booleano en la columna Rails existente (4)
He visto algunas preguntas (a saber, esta ) aquí en SO sobre la adición de un valor booleano predeterminado a una columna existente. Así que probé la sugerencia change_column
pero no debo hacerlo bien.
Lo intenté:
$ change_column :profiles, :show_attribute, :boolean, :default => true
Que devuelve -bash: change_column: command not found
Entonces corrí:
$ rails g change_column :profiles, :show_attribute, :boolean, :default => true
...y
$ rails change_column :profiles, :show_attribute, :boolean, :default => true
A continuación, ejecutó rake db:migrate
, pero el valor de :show_attribute
permaneció nil
. En la pregunta a la que hice referencia arriba, dice en PostgreSQL que necesita actualizarla manualmente. Como uso PostgreSQL, agregué lo siguiente en mi migración de create_profiles
:
t.boolean :show_attribute, :default => true
¿Puede alguien decirme qué estoy haciendo mal aquí?
Como una variación de la respuesta aceptada, también podría usar el método change_column_default
en sus migraciones:
def up
change_column_default :profiles, :show_attribute, true
end
def down
change_column_default :profiles, :show_attribute, nil
end
No estoy seguro de cuándo se escribió esto, pero actualmente para agregar o eliminar un valor predeterminado de una columna en una migración, puede usar lo siguiente:
change_column_null :products, :name, false
Rails 5:
change_column_default :products, :approved, from: true, to: false
http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns
Rieles 4.2:
change_column_default :products, :approved, false
http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns
Que es una buena manera de evitar mirar sus migraciones o esquemas para las especificaciones de la columna.
change_column
es un método de ActiveRecord::Migration
, por lo que no puede llamarlo así en la consola.
Si desea agregar un valor predeterminado para esta columna, cree una nueva migración:
rails g migration add_default_value_to_show_attribute
Luego, en la migración creada:
def up
change_column :profiles, :show_attribute, :boolean, default: true
end
def down
change_column :profiles, :show_attribute, :boolean, default: nil
end
Luego ejecute rake db:migrate
.
No cambiará nada a los registros ya creados. Para hacerlo, tendría que crear una rake task
o simplemente ir a la rails console
y actualizar todos los registros.
Cuando agregó t.boolean :show_attribute, :default => true
a la migración de create_profiles
, es normal si no hizo nada. Solo se ejecutan las migraciones que aún no se han ejecutado. Si comenzó con una nueva base de datos, establecería el valor predeterminado en verdadero.
change_column :things, :price_1, :integer, default: 123, null: false
Parece ser la mejor forma de agregar un valor predeterminado a una columna existente que ya no tiene null: false
.
De otra manera:
change_column :things, :price_1, :integer, default: 123
Alguna investigación que hice sobre esto:
https://gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b