Añadiendo: default = > true a booleano en la columna Rails existente
He visto algunas preguntas (a saber, esta) aquí sobre agregar 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
Luego corrió rake db:migrate
, pero el valor de :show_attribute
permaneció nil
. En la pregunta que mencioné arriba dice que en PostgreSQL necesitas actualizarlo manualmente. Ya que estoy usando PostgreSQL agregué lo siguiente en mi migración create_profiles
:
t.boolean :show_attribute, :default => true
¿Puede alguien decirme qué estoy haciendo mal aquí?
4 answers
change_column
es un método de ActiveRecord::Migration
, por lo que no se puede llamar 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 ejecuta rake db:migrate
.
No cambiará nada a los registros ya creados. Para ello tendrías que crear un rake task
o simplemente entrar en el rails console
y actualizar todos los registros.
Cuando agregaste t.boolean :show_attribute, :default => true
a la migración create_profiles
, es normal si no hizo nada. Solo se ejecutan las migraciones que aún no se han ejecutado. Si comenzó con una base de datos nueva, entonces establecería el valor predeterminado en true.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-05 22:51:06
Como una variación de la respuesta aceptada también puedes usar el método change_column_default
en tus migraciones:
def up
change_column_default :profiles, :show_attribute, true
end
def down
change_column_default :profiles, :show_attribute, nil
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-23 06:01:12
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
Carriles 5:
change_column_default :products, :approved, from: true, to: false
Http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns
Carriles 4.2:
change_column_default :products, :approved, false
Http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns
Que es una forma ordenada de evitar mirar a través de sus migraciones o esquema para las especificaciones de la columna.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-22 17:07:27
change_column :things, :price_1, :integer, default: 123, null: false
Parece ser la mejor manera de agregar un valor predeterminado a una columna existente que no tiene null: false
ya.
De lo contrario:
change_column :things, :price_1, :integer, default: 123
Algunas investigaciones que hice sobre esto:
Https://gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-05 22:59:50