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?

142
demandé sur Community 2011-12-25 02:15:27

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.

291
répondu Robin 2017-06-05 22:51:06

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

Rails API-docs

90
répondu Sebastiaan Pouyet 2013-11-23 06:01:12

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.

28
répondu fbelanger 2016-07-22 17:07:27
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

0
répondu Dorian 2017-06-05 22:59:50