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