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í?

Author: Community, 2011-12-25

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.

 291
Author: Robin,
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

Rails API-docs

 90
Author: Sebastiaan Pouyet,
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.

 28
Author: fbelanger,
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

 0
Author: Dorian,
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