web-dev-qa-db-fra.com

Ajout: default => true à un booléen dans une colonne Rails existante

J'ai vu quelques questions (à savoir celle-ci ) ici sur SO sur l'ajout d'une valeur booléenne par défaut à une colonne existante. J'ai donc essayé la suggestion change_column mais je ne dois pas le faire correctement.

J'ai essayé:

$ change_column :profiles, :show_attribute, :boolean, :default => true

Ce qui retourne -bash: change_column: command not found

J'ai ensuite couru:

$ Rails g change_column :profiles, :show_attribute, :boolean, :default => true

...et

$ Rails change_column :profiles, :show_attribute, :boolean, :default => true

Puis a lancé rake db:migrate, mais la valeur de :show_attribute est restée nil. Dans la question que j'ai mentionnée plus haut, il est dit dans PostgreSQL que vous devez le mettre à jour manuellement. Depuis que j'utilise PostgreSQL, j'ai ajouté ce qui suit dans ma migration create_profiles:

t.boolean :show_attribute, :default => true

Quelqu'un peut-il me dire ce que je fais mal ici?

144
tvalent2

change_column est une méthode de ActiveRecord::Migration, vous ne pouvez donc pas l'appeler ainsi dans la console.

Si vous souhaitez ajouter une valeur par défaut pour cette colonne, créez une nouvelle migration:

Rails g migration add_default_value_to_show_attribute

Puis dans la migration créé:

def up
  change_column :profiles, :show_attribute, :boolean, default: true
end

def down
  change_column :profiles, :show_attribute, :boolean, default: nil
end

Puis lancez rake db:migrate.

Cela ne changera rien aux enregistrements déjà créés. Pour ce faire, vous devez créer un rake task ou simplement aller dans le Rails console et mettre à jour tous les enregistrements.

Lorsque vous avez ajouté t.boolean :show_attribute, :default => true à la migration create_profiles, il est normal que rien ne soit fait. Seules les migrations qui n'ont pas encore été exécutées sont exécutées. Si vous avez commencé avec une nouvelle base de données, la valeur par défaut est définie sur true.

294
Robin

En variante de la réponse acceptée, vous pouvez également utiliser la méthode change_column_default dans vos migrations:

def up
  change_column_default :profiles, :show_attribute, true
end

def down
  change_column_default :profiles, :show_attribute, nil
end

Rails API-docs

92
Sebastiaan Pouyet

Je ne sais pas quand cela a été écrit, mais pour ajouter ou supprimer une valeur par défaut d'une colonne dans une migration, vous pouvez utiliser les éléments suivants:

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

Rails 4.2: 

change_column_default :products, :approved, false

http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns

C’est un moyen judicieux d’éviter de consulter vos spécifications de colonnes dans vos migrations ou votre schéma.

30
fbelanger
change_column :things, :price_1, :integer, default: 123, null: false

Semble être le meilleur moyen d’ajouter une valeur par défaut à une colonne existante qui n’a pas encore null: false.

Autrement:

change_column :things, :price_1, :integer, default: 123

Quelques recherches que j'ai faites sur ceci:

https://Gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b

0
Dorian

Si vous venez de faire une migration, vous pouvez revenir en arrière puis refaire votre migration.

Pour revenir en arrière, vous pouvez effectuer autant d’étapes que vous le souhaitez:

rake db:rollback STEP=1

Ensuite, vous pouvez simplement refaire la migration:

def change
  add_column :profiles, :show_attribute, :boolean, default: true
end

N'oubliez pas de rake db:migrate et si vous utilisez heroku heroku run rake db:migrate

0
Bruno M

En outre, selon le doc:

la valeur par défaut ne peut pas être spécifiée via la ligne de commande

https://guides.rubyonrails.org/active_record_migrations.html

Il n'y a donc pas de générateur de Rails prêt à l'emploi. Comme spécifié dans les réponses ci-dessus, vous devez remplir manuellement votre fichier de migration avec la méthode change_column_default.

Vous pouvez créer votre propre générateur: https://guides.rubyonrails.org/generators.html

0
Margotte