Ajout: default = > true to boolean dans la colonne Rails existants
j'ai vu quelques questions (à savoir celui-ci ) ici au sujet de 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
qui renvoie -bash: change_column: command not found
j'ai alors couru:
$ rails g change_column :profiles, :show_attribute, :boolean, :default => true
...et
$ rails change_column :profiles, :show_attribute, :boolean, :default => true
a couru rake db:migrate
, mais la valeur de :show_attribute
reste nil
. Dans la question que j'ai mentionnée ci-dessus, il est dit dans PostgreSQL que vous devez le mettre à jour manuellement. Depuis que J'utilise PostgreSQL j'ai ajouté ce qui suit dans mon create_profiles
migration:
t.boolean :show_attribute, :default => true
quelqu'un peut-il me dire ce que je fais de mal ici?
4 réponses
change_column
est une méthode de ActiveRecord::Migration
, donc vous ne pouvez pas l'appeler comme ça dans la console.
si vous voulez 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éée:
def up
change_column :profiles, :show_attribute, :boolean, default: true
end
def down
change_column :profiles, :show_attribute, :boolean, default: nil
end
, puis rake db:migrate
.
cela ne changera rien aux enregistrements déjà créés. Pour cela, vous devez le créer un rake task
ou tout simplement aller dans le rails console
et mettre à jour tous les enregistrements.
quand vous avez ajouté t.boolean :show_attribute, :default => true
à la migration create_profiles
, c'est normal s'il n'a rien fait. Seules les migrations qui n'ont pas encore été effectuées sont exécutées. Si vous avez commencé avec une nouvelle base de données, alors elle définirait la valeur par défaut à true.
comme variante de la réponse acceptée, vous pouvez aussi 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 actuellement pour ajouter ou supprimer un défaut d'une colonne dans une migration, vous pouvez utiliser ce qui suit:
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
qui est une façon soignée d'éviter de regarder à travers vos migrations ou schéma pour les spécifications de la colonne.
change_column :things, :price_1, :integer, default: 123, null: false
semble être la meilleure façon d'ajouter un défaut à une colonne existante qui n'a pas déjà 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